簡體   English   中英

Java泛型:為什么someObject.getClass()不返回Class <? extends T> ?

[英]Java generics: why someObject.getClass() doesn't return Class<? extends T>?

我希望從編譯時以及運行時的角度來看, .getClass()提供正確類型的返回值都不會成為問題。

但是我一定是錯的。

public class _GetClassGenerics2 {

  static class MyClass {
  }

  public static void main(String[] args) {
    MyClass myInstance = new MyClass();
    // here it works
    Class<? extends MyClass> type = myInstance.getClass();

    myMethod(myInstance);
  }

  public static <T extends MyClass> void myMethod(T instance) {
    Class<? extends T> type = instance.getClass();
// java.lang.RuntimeException: Uncompilable source code - incompatible types
//  required: java.lang.Class<? extends T>
//  found:    java.lang.Class<capture#1 of ? extends _GetClassGenerics2.MyClass>
  }

}

編輯:它不適用於Class<T>Class<? super T> Class<? super T>

java.lang.Class不代表類型(為此使用java.lang.reflect.Type )。 如果TArrayList<String>則沒有Class<ArrayList<String>>

值得注意的是,在這種特殊情況下,不需要通用方法。

public static <T extends MyClass> void myMethod(T instance) {

等效於:

public static void myMethod(MyClass instance) {

按照getClass方法的Javadoc

實際的結果類型是Class<? extends |X|> Class<? extends |X|>其中| X | 是擦除在其上調用getClass的表達式的靜態類型。 例如,此代碼段中不需要強制轉換

這里, |X|的值 您的代碼段中是MyClass ,因此instance.getClass()只能分配給Class<? extends MyClass> Class<? extends MyClass>Class<?>

使用這種特定措辭的原因是因為當您說該類型為T的變量(其中<T extends MyClass> ,可以存在多個擴展MyClass類,因此能夠滿足T extends MyClass條件。 沒有運行時信息,就無法知道在方法中傳遞了MyClass哪個具體實現子類。 因此,為了提供通用解決方案,它返回<? extends MyClass> <? extends MyClass>因為無論傳入什么類實例,這對於MyClass任何子類都適用。

Java不支持<this>的通用類型,例如

對象可以實現

class Object {
    Class<this> getClass()
}

但是getClass()無法表示將返回一個類型,即對象的類。 編譯器也不了解此方法的功能。

恕我直言,此行為應得到支持。

代替

Class<? extends T> type = instance.getClass();

你需要使用

Class<? extends MyClass> type = instance.getClass();

您不能在此處直接使用T

原因是Object.getClass()的方法簽名(正在調用)。 它的:

public final Class<? extends Object> getClass()

因此,您正在嘗試從Class<? extends Object>轉換Class<? extends Object> Class<? extends Object>Class<? extends T> Class<? extends T> ,這是不允許的(因為您正在向下廣播)。 使用一個明確允許投:

Class<? extends T> type = (Class<? extends T>) instance.getClass();

將起作用(盡管它會生成類型安全警告)。

暫無
暫無

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

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