2012-11-30 47 views
4

這裏是I類有:Java - 這個泛型類的正確簽名是什麼?

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> { 
    ... 
} 

但現在模式的子類是不允許的。

如何告訴編譯器ProxyDAO實現了DAO接口,並且此接口將接受Model類或任何子類或Model?

DAO.java

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

回答

4

使用以下:

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

如果你需要允許DAO的supclasses:

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

編譯錯誤 –

+0

已修復,請參閱update –

1

做一些如

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

} 
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."); 
    } 
}