Java泛型:某种类型的超级超级集合

时间:2015-02-27 17:00:41

标签: java generics superclass super

考虑以下自包含样本:

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

1 个答案:

答案 0 :(得分:1)

喜欢这样

Collection<? extends Type<? super C>> superSuperTypes = mySuperType.getSuperTypes();