Java - 这个泛型类的正确签名是什么?

时间:2012-11-30 10:07:47

标签: java generics

这是我的课程:

public class ProxyDAO<T extends DAO<? extends Model>> implements DAO<? extends Model> {
   ...
}

编译器抱怨A supertype may not implement a wildcard

我试过这个:

public class ProxyDAO<T extends DAO<? extends Model>> implements DAO<Model> {
   ...
}

但现在不允许使用Model的子类。

如何告诉编译器ProxyDAO实现了DAO接口,并且该接口是接受Model类还是任何子类或模型?

DAO.java

public interface DAO<T extends Model> {
    T findByPK(Object pk);
}

3 个答案:

答案 0 :(得分:4)

使用以下内容:

public class ProxyDAO<T extends Model> implements DAO<T>

如果您需要允许DAO的超类:

public class ProxyDAO<T extends Model, V extends DAO<T>> implements DAO<T>

答案 1 :(得分:1)

做点什么

class ProxyDao<M extends Model, T extends Dao<M>> implements Dao<M> {

}

答案 2 :(得分:0)

我明白了。在implements子句中,除了使用两个通用参数外,不可能设置未定义的类型。您可以设置实际类型,例如Model。所以这段代码将起作用:

class Model{}

class SubModel extends Model{}

interface DAO<T extends Model> {
    T findByPK(T pk);
}

class ProxyDAO<T extends DAO<? extends Model>> implements DAO<Model> {

    public ProxyDAO() {
        findByPK(new SubModel());
    }

    @Override
    public Model findByPK(Model pk) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}