我有一个像这样的抽象工厂:

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>

10-04 15:25