无法应用于SuperType

时间:2014-06-02 13:25:44

标签: java generics

我对泛型有问题。

我有一个SuperType和两个SubTypes。类结构如下:

class SuperType {}
class FirstSubType extends SuperType {}
class SecondSubType extends SuperType {}

然后我用一种方法创建TypedClass:

abstract class TypedClass<T extends SuperType> {
    protected abstract String getStatus(T o);
}

我尝试将它用作匿名类:一个用于FisrtSubType,另一个用于SecondSubType:

new TypedClass<FirstSubType>() {
    @Override
    protected String getStatus(FirstSubType o) {
        return "FirstSubType";
    }
};

new TypedClass<SecondSubType>() {
    @Override
    protected String getStatus(SecondSubType o) {
        return "SecondSubType";
    }
};

我尝试将theese对象保存在变量类型中:

TypedClass<? extends SuperType> typedClass;

当我获得SuperType的对象并尝试使用该对象作为参数调用getStatus时,我收到错误:? extends SuperType不能应用于SuperType。

代码如下:

private void go(SuperType superTypeObj, String strT) {
    TypedClass<? extends SuperType> typedClass = getTypedClass(strT);
    String status = typedClass.getStatus(superTypeObj);
    System.out.println(status);
}

上述方法的代码在第二行中进行破解(使用superTypeObj作为参数调用getStatus)。

方法getTypedClass(String strT)返回TypedClass<? extends SuperType>并创建TypedClass<FirstSubType>TypedClass<SecondSubType>,具体取决于String参数(strT):

private TypedClass<? extends SuperType> getTypedClass(String strType) {
    TypedClass<? extends SuperType> res = null;
    if ("FirstSubType".equals(strType)) {
        res = new TypedClass<FirstSubType>() {
            @Override
            protected String getStatus(FirstSubType o) {
                return "FirstSubType";
            }
        };
    } else {
        res = new TypedClass<SecondSubType>() {
            @Override
            protected String getStatus(SecondSubType o) {
                return "SecondSubType";
            }
        };
    }
    return res;
}

0 个答案:

没有答案