2016-03-04 125 views
0

编辑我应该原本提到这对于任何人,试图帮助回答这个问题,但(对File1.java getList(String variable))这个方法实际上是被调用时,客户端应用程序一个RESTful端点将GET请求发送到调用方法的类上的任何路径。Java的动态方法的返回类型

我有一个将字符串变量作为参数的方法。我试图实现的功能是,基于该字符串变量的值,该方法将构造两个不同列表中的一个,并返回该列表。这可能吗?我尝试使用类似于this stackoverflow question下的第三个答案中的人的通用方法,但是我可能没有正确实现它,因为我得到了Type parameter [GenericType] not a class or parameterized type whose raw type is a class IllegalArgumentException。这里是我的代码,并有多远我:

File1.java - 有些东西略去了

@Component 
public class File1{ 

    private File2 file2; 

    @Autowired 
    private File1(File2 file2) { 
     this.file2 = file2; 
    } 

    public <GenericType> GenericType getList(String variable) { 
     return (GenericType)this.file2.getList(variable); 
    } 
} 

File2.java - 有些东西略去了

@Component 
public class File2 { 
    public <GenericType> GenericType getList(String variable) { 
      List<SomeClass> listA = new ArrayList<>(); 
      List<SomeOtherClass> listB = new ArrayList<>(); 
     if(variable.equals("something")) { 
      //build listA... 
     } 
     else { 
      //build listB instead... 
     } 
     if(variable.equals("something")) 
      return (GenericType) listA; 
     else 
      return (GenericType) listB; 
    } 
} 

SomeClass.java

public class SomeClass{ 
    public String string; 
    public List<NestedList1> nestedList1 = new ArrayList<>(); 
    public List<NestedList2> nestedList2 = new ArrayList<>(); 

    public SomeClass(String string, List<NestedList1> nestedList1 , List<NestedList2> nestedList2) { 
     this.string= string; 
     this.nestedList1 = nestedList1 ; 
     this.nestedList2 = nestedList2 ; 
    } 
} 

SomeOtherClass.java

public class SomeOtherClass{ 
    public String string; 
    public List<NestedList3> nestedList3 = new ArrayList<>(); 

    public SomeOtherClass(String string, List<NestedList3> nestedList3) { 
     this.string = string; 
     this.nestedList3 = nestedList3; 
    } 
} 

@component和@autowired注释只是弹簧配置的东西,所以你可以忽略它,因为它与问题无关。无论如何,我觉得这比我想要的要简单得多,但我对Java仍然很陌生,这是我第一次使用泛型方法。如果有帮助,正在返回的列表本身不是动态的。这种方法应该只会总是返回这两个特定列表中的一个。

+1

这是我见过的最长的演员表 – jhamon

+0

它有点多余。我可以编辑它,但这仍然不能解决我原来的问题。 – bscott

+0

在你的情况下,我会考虑使用通配符'?',比如'list '。是的,'(List <?extends SomeOtherClass>)(List )'是完全多余的 – jhamon

回答

1

为了让这个技巧奏效,Java需要有一种办法来设法确定GenericType的实际类型。当您在代码中显式调用某个方法并将其结果指定给变量时(如在链接的答案中),可以推断出GenericType是该变量的类型。这是在编译时完成的,Java对它很好。

一个安静的端点,比如你正在做的没有那个。您的REST提供者必须在运行时使用反射来确定类型,并且所需的信息不存在。首先,没有非反射式的代码调用来推断类型信息,而对于另一种类型的擦除,无论如何都会在编译过程中丢弃它。

幸运的是,实际上不需要这个。您可能的返回值都是List。只需声明该方法为返回List

+0

谢谢!我认为这不是相关的,但也许我应该提到,这是我的问题中一个平静的端点,而不是任何Java应用程序。 只需将端点的返回类型更改为常规'List'类型即可。 – bscott

1

Java不能这样做(一般情况下)。

的用法是:

List<?> list = file1.getList(s); 

,然后动态检查内容。

为此,如果不在列表元素中(这可能为空),而是在列表本身中,将会很好。

通常制作一个包含不同类型列表的类,并返回一个列表为空的列表。