考虑以下自包含样本:
import java.util.*;
class TestApplication
{
interface Type<C>
{
Collection<Type<? super C>> getSuperTypes();
}
static class Test<C>
{
private final Type<? super C> mySuperType = get( null );
public Collection<Type<? super C>> getSuperTypes()
{
Collection<Type<? super C>> superTypes = new ArrayList<>();
superTypes.add( mySuperType );
//directly passing the super-types to addAll() works
superTypes.addAll( mySuperType.getSuperTypes() );
//but how can I declare the variable to temporarily hold the supers?
Collection<Type<? super C>> superSuperTypes = mySuperType.getSuperTypes(); //ERROR
superTypes.addAll( superSuperTypes );
return superTypes;
}
}
public static <T> T get( T value )
{
return value;
}
}
所以,我有这个类代表一个类型,它有一个超类型,而超类型又有超类型,我希望有一个函数返回一个类型的所有超类型的平面集合。
所以,我声明了一个超类型的集合,我添加了当前类型的直接超类型,然后我还需要添加超类型的超类型。 (没关系,这是非常低效的,实际上我是以更有效的方式做到的,但那是无关紧要的。)
因此,目标是调用superTypes.addAll()
将结果传递给superType.getSuperTypes()
。
如果superType.getSuperTypes()
的结果在没有中间变量的情况下直接传递给superTypes.addAll()
,则没有问题。
但是如果我想声明一个中间变量superSuperTypes
来保存superType.getSuperTypes()
的结果,然后再将其传递给superTypes.addAll()
,我就找不到一种方法来声明该变量以便它编译。就目前而言,它提供了以下信息:
Error:(100, 84) java: incompatible types: java.util.Collection<TestApplication.Type<? super capture#1 of ? super C>> cannot be converted to java.util.Collection<TestApplication.Type<? super C>>
那么:应该如何宣布superSuperTypes
,以便能够为superType.getSuperTypes()
分配结果,然后将其传递给superTypes.addAll()
?
答案 0 :(得分:1)
喜欢这样
Collection<? extends Type<? super C>> superSuperTypes = mySuperType.getSuperTypes();