2011-06-07 51 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()方法,因为您不知道它能够接受的元素的类型。