簡體   English   中英

java。 如何獲得在方法上定義的泛型類型?

[英]java. how can i get generic type which is defined on method?

問題1:建議我有一個這樣的例子

public <T> void methodA(T req) { // doSth }

psvm(){
   ClassA aClass = new ClassA();
   aClass.<String>methodA("hello world");
}

那么我可以在methodA中輸入'String'而不實際將'String'傳遞給它嗎?

問題2:如果前面的例子轉換成這個

public <T> void methodA(Predicate<T> req) { // doSth }

psvm(){
   ClassA aClass = new ClassA();
   aClass.<String>methodA(item -> "hello world".equals(item));
}

我的意思是傳遞給methodA的不再是簡單的object,而是一個lamda表達式,我可以在methodA中輸入'String'嗎?

不,由於類型擦除,無法確定泛型方法的泛型類型。 在編譯時,方法的泛型類型被丟棄,運行時沒有辦法獲取這些信息。

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,例如class MyList implements List<String> )。 但是,對於泛型方法,沒有辦法這樣做。

如果您需要該信息,您能做的最好的事情就是將其傳遞(您表示您不想這樣做):

public <T> void methodA(T req, Class<T> type) {
    // [...]
}

另一種選擇,如果您只需要傳入的 object 的類型而不是通用方法的類型,則可以獲取 object 的 class。

public <T> void methodA(T req) {
    Class<T> type = req.getClass(); // Assuming req is non-null
    // [...]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM