我无法将其编译,我看不出原因。 最后,我想传递一个对象集合,这些对象的类将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<capture#8-of ? extends TClass>) in the type
Generator<capture#7-of ?,capture#8-of ? extends TClass> is not applicable for the arguments (Collection<capture#9-of ? extends TClass>)
答案 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()
方法,因为您不知道它能够接受的元素类型。