[英]Type bound is not inferred via constructor when using a Class parameter?
試圖了解為什么Java在使用Class參數傳遞類型信息時在推斷類型和檢查類型界限方面表現出不同的行為。
以以下代碼為例:
public class TypeTest<T extends Number> {
Class<T> type;
TypeTest(Class<T> type) { this.type = type; }
static <S extends Number> void sMethod(Class<S> type) {}
<S extends Number> void method(Class<S> type) {}
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
// 1.
TypeTest<Integer> obj = new TypeTest(Object.class); // compiles, unchecked call and assignment warnings
// 2.
obj.method(Object.class); // compile-time error, S not within bound
TypeTest obj1 = new TypeTest(Object.class); // compiles, unchecked call and assignment warnings
// 3.
obj1.method(Object.class); // compiles, unchecked call warning .
// 4.
TypeTest.sMethod(Object.class); // compile time error, Object not within bounds
// 5.
new TypeTest<Object>(Object.class); // compile time error, Object not within bounds
}
}
使用靜態方法(4.),我們不能傳遞任何不是數字的東西,這似乎是提供的界限最自然的行為。
但是,對於構造函數(1,。,5),我們必須顯式指定類型參數才能獲得與4相同的行為。否則,似乎不是從Object.class變量自動推斷出T類型參數值。
構造函數和靜態方法的區別在哪里?
我還不完全理解的另一種情況是2和3之間的區別。為什么相同的操作編譯或不編譯僅取決於TypeTest對象的構造方式,而類類型參數T與該方法沒有任何關系類型參數S?
new TypeTest(Object.class)
是原始TypeTest
的表達式,這就是它的設計方式。 因此,當然沒有類型推斷,因為沒有類型推斷 。
當你忽略了一個泛型類型的類型參數-也就是說,任何時候你輸入TypeTest
沒有<Something>
- Java的忽略為所有類型的所有通用的檢查。
有關詳細信息,請參見http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html 。
只能推斷為方法或構造函數聲明的泛型類型。 所以
<S> void method() {}
^ this can be inferred
<S> TypeTest() {}
^ this can be inferred
泛型類的泛型類型在構造時無法推斷:
class TypeTest<T> {}
^ this must be specified explicitly when using "new TypeTest"
or in Java 7 you can explicitly specify the diamond operator
正如其他人提到的那樣,當您使用不帶尖括號的new TypeTest()
,您正在使用原始類型。 原始類型必須以與泛型之前相同的方式工作,以保持與舊代碼的兼容性。 因此,表達式new TypeTest()
類型TypeTest
(原始類型),而不是TypeTest<something>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.