用返回类型参数类的方法实现接口

时间:2014-01-14 13:13:49

标签: java generics

我有第三方界面Converter<PRESENTATION, MODEL>,其中包含方法

Class<MODEL> getModelType();

我需要有一个扩展Converter<String, Id<SOMETYPE>>的实现,以便满足编译器,我需要实现以下方法:

@Override
public Class<Id<SOMETYPE>> getModelType() {
    return Id<SOMETYPE>.class;  // does not compile
}

这是一个极端情况,我需要恢复使用原始类型并实现Converter<String, Id>(使用原始类型Id)?

2 个答案:

答案 0 :(得分:4)

由于类型擦除,Id<SOMETYPE>.classId.class相同,除了您不能返回前者或后者(编译错误)。所以你需要欺骗编译器,例如:

@Override @SuppressWarnings("unchecked")
Class<List<String>> getModelType() {
    return (Class<List<String>>)(Class<?>)List.class;
}

答案 1 :(得分:2)

我最近也遇到过这个问题。这是帮助我的问题:

Java casting ".class"-operator used on a generic type, e.g. List, to "Class<List<?>>" and to "Class<List<Integer>>"

您的案例中的解决方案是:

public interface Converter<PRESENTATION, MODEL>  {
    Class<MODEL> getModelType();
}

interface Id<E>  {
}

class MyConverter<E> implements Converter<String, Id<E>>  {
    @Override
    public Class<Id<E>> getModelType() {

        @SuppressWarnings("unchecked")  //We know this is okay
        Class<Id<E>> cls = (Class<Id<E>>)(Class)Id.class;
         return  cls;
    }
}