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