2011-06-07 100 views
1

我無法得到這個編譯,我看不出原因。 最終,我想傳遞一個對象的集合,這些對象的類將TClass擴展到生成方法中,該方法需要類擴展TClass的對象的集合,這應該起作用。有界的Java的泛型不編譯

任何幫助,將不勝感激。

public interface Generator<IT extends ITClass, T extends TClass> { 

    IT generate(Collection<T> tClassCollection) 
} 

Generator<?, ? extends TClass> generator = generatorClass.newInstance(); 

Collection<? extends TClass> TClassCollection = ... 

... generator.generate(TClassCollection);

我得到這個錯誤

The method generate(Collection&lt;capture#8-of ? extends TClass>) in the type 
Generator&lt;capture#7-of ?,capture#8-of ? extends TClass> is not applicable for the arguments (Collection&lt;capture#9-of ? extends TClass>) 
+0

ITClass是否實施/擴展自Collection 或Collection ? – Raze 2011-06-09 10:40:12

回答

1

這應該工作

否;如果它確實會在類型系統中出現漏洞。試想一下:

class SpecialT extends TClass {} 

class SpecialGenerator extends Generator<ITClass, SpecialT> {} 

Generator<?, ? extends TClass> generator = SpecialGenerator.class.newInstance(); 
Collection<? extends TClass> TClassCollection = Arrays.asList(new TClass()); 
generator.generate(TClassCollection); 

一個SpecialGenerator只能用Collection<SpecialT>工作,但你試圖傳遞一個Collection<TClass>,它可以包含比SpecialT其他類型的實例。

1

泛型聲明中的通配符並不意味着「任何類型」;它意味着「某種特定的未知類型」。

所以,如果你有一個Generator<?, ? extends TClass>,這並不意味着,只要它包含的TClass亞型,你可以通過它generate()方法的任何Collection

相反,這意味着您不能以類型安全的方式調用generate()方法,因爲您不知道它能夠接受的元素的類型。