問題 1:
建議我有一個這樣的例子:
public <T> void methodA(T req) { // doSth }
psvm(){
ClassA aClass = new ClassA();
aClass.<String>methodA("hello world");
}
然后我可以拿到型別String在methodA沒有實際傳遞String給它?
問題2:
如果將前面的示例轉換為:
public <T> void methodA(Predicate<T> req) { // doSth }
psvm(){
ClassA aClass = new ClassA();
aClass.<String>methodA(item -> "hello world".equals(item));
}
我的意思是傳遞到methodA沒有更簡單的物件,但是lambda運算式,也可以我得到型別String的methodA?
uj5u.com熱心網友回復:
不,由于型別擦除,無法確定泛型方法的泛型型別。在編譯時,方法的泛型型別被丟棄,并且在運行時沒有辦法獲取這些資訊。
public class ClassA {
public <T> void methodA(T req) {
Class<T> genericType = ?; // Impossible to get e.g. Class<String>
// [...]
}
public static void main(){
new ClassA().methodA("hello world");
}
}
在某些情況下,保留泛型型別資訊(例如使用特定泛型型別擴展泛型類,例如class MyList implements List<String>)。但是,對于泛型方法沒有辦法這樣做。
如果您需要該資訊,您可以做的最好的事情就是將其傳入(您表示不想這樣做):
public <T> void methodA(T req, Class<T> type) {
// [...]
}
另一種選擇是,如果您只需要傳入的物件型別而不是泛型方法的型別,那么獲取物件的類。
public <T> void methodA(T req) {
Class<T> type = req.getClass(); // Assuming req is non-null
// [...]
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/393621.html
