我有一个像这样的抽象工厂:
public abstract class DAOFactory {
public abstract EntryDAO<EntryDTO> getEntryDAO();
...
}
使用我的DAO和DTO接口,如下所示:
public interface EntryDTO extends GenericDTO {
}
public interface EntryDAO<T extends EntryDTO> extends GenericDAO<T, Serializable> {
}
我的实现是这样的:
public class EntryDTOImpl implements EntryDTO {
}
public class EntryDAOImpl<T extends EntryDTO> extends GenericDaoImpl<EntryDTOImpl, ObjectId>
implements EntryDAO<T> {
}
现在,如果我创建一个工厂并覆盖
getEntryDAO
方法,如下所示:public class MyDAOFactory extends DAOFactory {
@Override
public EntryDAO<EntryDTO> getEntryDAO() {
try {
return new EntryDAOImpl<EntryDTOImpl>();
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
我收到一个编译时错误:
类型不匹配:无法从EntryDAOImpl转换为EntryDAO
编辑
我已经像这样更新了我的抽象工厂:
public abstract <T extends EntryDTO> EntryDAO<T> getEntryDAO();
并在我的工厂实施中进行了更改:
@Override
public <T extends EntryDTO> EntryDAO<T> getEntryDAO() {
try {
return new EntryDAOImpl<EntryDTOImpl>();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
现在我得到了编译时错误:
Type mismatch: cannot convert from EntryDAOImpl<EntryDTOImpl> to EntryDao<T>
最佳答案
以此方式定义抽象方法(注意?
而不是T
):
public abstract EntryDAO<? extends EntryDTO> getEntryDAO(); //should work for you
我以理解的方式重新创建了场景:将
subclass1<subclass2>
返回为interface1<interface2>
例如,这很好用:
public static List<? extends CharSequence> dostuff1() {
return new ArrayList<String>();
}
但这不起作用:
public <B extends CharSequence> List<B> dostuff2() {
return new ArrayList<String>();
}
这给出了与您相同的编译时错误:
Type mismatch: cannot convert from ArrayList<String> to List<B>