我一直在閱讀Java中的泛型。在 以下教程的通配符部分中,所有示例均適用於參數化方法。它讓我想到爲什麼沒有例子 通配符參數化類型聲明。 http://docs.oracle.com/javase/tutorial/java/generics/wildcards.htmlJava中的通配符參數化類型
這是否有意義?這是什麼意思?
public class MyClass<?>{
? myVar;
}
我一直在閱讀Java中的泛型。在 以下教程的通配符部分中,所有示例均適用於參數化方法。它讓我想到爲什麼沒有例子 通配符參數化類型聲明。 http://docs.oracle.com/javase/tutorial/java/generics/wildcards.htmlJava中的通配符參數化類型
這是否有意義?這是什麼意思?
public class MyClass<?>{
? myVar;
}
想象B
爲A
子,即:
public class A {}
public class B extends A {}
所以,下面的代碼是合法的:
A a = new A();
A b = new B();
但是,你不能投甚至同一泛型類的參數化類型,甚至如果他們的類型參數是「是」的關係,即下面的代碼是非法:
MyClass<A> aClass = new MyClass<A>();
MyClass<A> bClass = new MyClass<B>(); //compile error
(見Oracle Generics Tutorial對於更詳細的說明關於「是」參數化類型之間的關係)
所以在這種情況下,你應該使用通配符:
MyClass<?> aClass = new MyClass<A>();
MyClass<?> bClass = new MyClass<B>();
MyClass<? extends A> aClass = new MyClass<A>();
MyClass<? extends A> bClass = new MyClass<B>();
在非通用對象的情況下,不需要通配符。你總是可以使用Object(或其他上限)並將未知類型的值轉換爲它。
關於你的例子,這是沒有意義的。 MyClass<?>
是參數化類型,即通過傳遞類型參數?
創建的具體類型,但它不是泛型類的聲明(請參閱generic type invocation)。宣言應該是這樣的:
public class MyClass<T> {
T myVar;
}
所以T
是一種參數,而通配符(或具體類型)是類型參數。
有了泛型,你只是做:
public class MyClass<T>{
T myVar;
}
的?
語法主要是用來當你想給更多的背景 - 即? exteds SomeType
我相信你只是使用'Object myVar;'和一個無界的通配符。 –