任何类型的Java泛型方法返回列表extendends XXX

时间:2015-12-07 13:12:20

标签: java generics

我想创建一个基于intpu的方法String(不是类)可以返回不同的对象列表,扩展为XXX

到目前为止,我在这里,我完全不明白为什么这不起作用:

public <T extends XXX> List<T> getXXXList(String yyy) {
     switch (yyy) {
          case "test" :
               return getListOfTypeFFF();
      }
}

修改 这是InteliJ对此的评价: enter image description here

你可以信任我 - Poi延长了XXX

编辑2

public abstract class TranslationalEntity implemenst Serializable {

     private String tranlsation;
}

public class Poi extends TranslationalEntity {
     private String latLong;
}


public class Material extends TranslationalEntity {
     private String author;
}


public class News extends TranslationalEntity {
     private String time;
}

对于那些类型的实体,我想制作一个将返回右侧列表的方法:

public <T extends TranslationalEntity> List<T> getXXXList(String yyy) {
     switch (yyy) {
          case "poi" :
               return getListOfPoi();

          case "news" :
               return getListOfNews();
      }
return null;
}

编辑3

public List<Poi> getListOfPoi() {
    return entityManager.createNamedQuery("allPoi").getResultList();
}

1 个答案:

答案 0 :(得分:1)

我认为这里发生的事情是你试图让编译器执行一个在编译时无法做到的决定(静态):

String input = args[1];
List<Poi> result = getXXXList(input);

- 编译器是否允许这样做?您似乎认为如果输入为"test",这应该是合法的,但编译器不知道输入。

查看它的其他方法是 - 调用getXXXList(input)的(静态,编译时)返回类型应该是什么?

  • 不能List<Poi>,因为您不知道input包含哪些内容
  • 不能List<XXX>,因为您无法将方法中可能使用的List<Poi>转换为List<XXX>
  • 可能是List<? extends XXX>,但签名必须是

    public List<? extends XXX> getXXXList(String yyy)
    

如果编译器可以在编译时基于某些输入参数的类型推断返回类型的类型参数,则public <T> T foo()签名很有效,例如

public <T> T getBean(Class<T> clazz)

但是编译器只能使用静态信息,并且不能根据运行时值来决定。