泛型:无法转换为多个泛型类型

时间:2018-12-11 09:41:24

标签: java generics casting

以下结构

abstract class EntityClazz<ENTITY>{}

abstract class DTOClazz<DTO extends DTOClazz<DTO>> {}

interface Fee<SOME extends DTOClazz>{}

public class FuuDTO extends DTOClazz<FuuDTO>{}

public class FuuEntity extends EntityClazz<FuuEntity> implements Fee<FuuDTO>{
    static List<FuuEntity> findBySomeData(String someData){ ...}
}

public class FiiDA<DTO extends DTOClazz<DTO>, ENTITY extends EntityClazz<ENTITY> & Fee<DTO>> {
    public void findBySomething(String data) {
    //This does not work!
        List<ENTITY> findSomeThing = (List<ENTITY>)FuuEntity.findBySomeData(data);
    }
}

编辑1

添加了更多的类/示例:

void someTest() {
    FiiDA<FuuDTO, FuuEntity> da = new FiiDA(); 
    da.findBySomething("HELLO WORLD");
}

是的,请不要告诉我这是胡扯。我确实知道这一点!

该类型转换仅被视为未经检查的类型转换,由于编译器说:

  

无法转换为java.util.List

我不明白。是这种类型的擦除吗?但是FuuEntity确实实现了接口和EntityClazz。我为什么不能只投下它。它不应该使里面真正的东西变得无光泽。

1 个答案:

答案 0 :(得分:0)

子类列表不能转换为超类列表。例如:无法将SELECT MAX(ID), LISTAGG(GRP, ',') WITHIN GROUP (ORDER BY SUBSTR(GRP, 1, 1)) AS GRP, LISTAGG(VALUE, ',') WITHIN GROUP (ORDER BY SUBSTR(GRP, 1, 1)) AS PAIRS FROM YourTable GROUP BY SUBSTR(GRP, 1, 1); 列表强制转换为List<Dog>,其背后的原因是,您可能最终将猫只添加到了本应只包含狗的列表中。

List<Animal>
  

这里有一个非常简单的规则-变量声明的类型   必须与您传递的类型与实际对象类型相匹配。如果您声明   列出foo,那么您分配给foo引用的任何内容都必须是   通用类型的。不是的子类型。不是...的超类型   。只是List<Parent> myList = new ArrayList<Child>();//Won't work