Java 泛型多态性混淆?
我有一个这样的抽象工厂:Java 泛型多态性混淆?,java,generics,polymorphism,Java,Generics,Polymorphism,我有一个这样的抽象工厂: public abstract class DAOFactory { public abstract EntryDAO<EntryDTO> getEntryDAO(); ... } public abstract <T extends EntryDTO> EntryDAO<T> getEntryDAO(); 我得到一个编译时错误: 类型不匹配:无法从EntryDAOImpl转换为EntryDAO 编辑 我更新了我的
public abstract class DAOFactory {
public abstract EntryDAO<EntryDTO> getEntryDAO();
...
}
public abstract <T extends EntryDTO> EntryDAO<T> getEntryDAO();
我得到一个编译时错误:
类型不匹配:无法从EntryDAOImpl转换为EntryDAO
编辑
我更新了我的抽象工厂,如下所示:
public abstract class DAOFactory {
public abstract EntryDAO<EntryDTO> getEntryDAO();
...
}
public abstract <T extends EntryDTO> EntryDAO<T> getEntryDAO();
public abstract EntryDAO getEntryDAO();
并在我的工厂实施中进行了更改:
@Override
public <T extends EntryDTO> EntryDAO<T> getEntryDAO() {
try {
return new EntryDAOImpl<EntryDTOImpl>();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@覆盖
public EntryDAO getEntryDAO(){
试一试{
返回新的EntryDAOImpl();
}捕获(未知后异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
现在我得到了编译时错误:
类型不匹配:无法从EntryDAOImpl转换为EntryDao
以这种方式定义抽象方法(注意
?
而不是T
):
public abstract EntryDAO以这种方式定义抽象方法(注意?
而不是T
):
public abstract EntryDAO发生这种情况的原因是您试图返回一个EntryDaoImpl
,它是EntryDAO
的子类型,而不是EntryDAO
,后者是方法的返回类型
解决方案:
我相信您希望将getEntryDao
方法的返回类型更改为
EntryDAO发生这种情况的原因是您试图返回一个EntryDaoImpl
,它是EntryDAO
的子类型,而不是EntryDAO
,后者是方法的返回类型
解决方案:
我相信您希望将getEntryDao
方法的返回类型更改为
EntryDAO只需将返回类型从EntryDAO
更改为EntryDAO只需将返回类型从EntryDAO
更改为EntryDAO我已经做了建议的更改,但仍然存在问题。请查看我的编辑。我已进行了建议的更改,但仍有问题。请看我的编辑。你能解释一下我为什么需要这样做吗?为什么我不能直接使用t
?我不确定我是否完全理解您所说的“所有t
-接受方法,如save(t)
removed”是什么意思。通过说entrydao,你能解释一下我为什么需要这样做吗?为什么我不能直接使用t
?我不确定我是否完全理解您所说的“所有t
-接受方法,如save(t)
removed”是什么意思。通过说EntryDaoThank-为什么我不能使用接口作为参数化类型,并替换一个实现?在运行时,程序不会知道EntryDTOImpl
是否是t
的一种类型。但是它知道T
,因此如果要返回它,必须在函数中调用它T
。这将编译:返回新的EntryDAOImpl()代码>。谢谢-为什么我不能使用接口作为参数化类型,并替换实现?在运行时,程序不会知道EntryDTOImpl
是否是t
的类型。但是它知道T
,因此如果要返回它,必须在函数中调用它T
。这将编译:返回新的EntryDAOImpl()代码>。
@Override
public <T extends EntryDTO> EntryDAO<T> getEntryDAO() {
try {
return new EntryDAOImpl<EntryDTOImpl>();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public abstract EntryDAO<? extends EntryDTO> getEntryDAO(); //should work for you
public static List<? extends CharSequence> dostuff1() {
return new ArrayList<String>();
}
public <B extends CharSequence> List<B> dostuff2() {
return new ArrayList<String>();
}
@Override
public <T extends EntryDto> EntryDao<? extends T> getEntryDao() {
try {
return new EntryDAOImpl<EntryDTOImpl>();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return dao;
}
T load(Serializable id);
void save(T t);
EntryDao<EntryDTO> x = new EntryDao<PersonDTO>(); // currently this is a compile time error
x.save(new CarDTO()); // a run time error, because x can only save Persons, not Cars