有限的Java Generics没有编译

时间:2011-06-07 19:53:42

标签: java generics

我无法将其编译,我看不出原因。 最后,我想传递一个对象集合,这些对象的类将TClass扩展为generate方法,该方法接受类扩展TClass的对象的集合, 这应该工作。

任何帮助将不胜感激。

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

通用声明中的通配符并不意味着“任何类型”;它的意思是“某种特殊的未知类型。”

因此,如果您有Generator<?, ? extends TClass>,则并不意味着您可以将generate()方法传递给任何Collection,只要它包含TClass的子类型即可。

相反,这意味着您无法以类型安全的方式调用其generate()方法,因为您不知道它能够接受的元素类型。