2013-12-20 35 views

回答

0

想象BA子,即:

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>(); 

upper bounded wildcards

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是一種參數,而通配符(或具體類型)是類型參數

1

有了泛型,你只是做:

public class MyClass<T>{ 
    T myVar; 
} 

?語法主要是用來當你想給更多的背景 - 即? exteds SomeType