编辑 我本来应该为那些试图帮助回答这个问题的人提到这个,但是这个方法(File1.java上的getList(String variable)
)实际上是一个RESTful端点,当客户端应用程序向调用方法的类中的任何路径发送GET请求时调用。
我有一个将字符串变量作为参数的方法。我试图实现的功能是,基于该字符串变量的值,该方法将构造两个不同列表中的一个,并返回该列表。这可能吗?我尝试使用类似于this stackoverflow question中第3个答案中的人的通用方法,但我可能没有正确实现它,因为我得到了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的新手,这是我第一次使用泛型方法。如果它有帮助,那么返回的列表本身就不是动态的。此方法应该始终返回这两个特定列表中的一个。
答案 0 :(得分:1)
Java无法做到(通常)。
用法是:
SomeModel.objects.filter(name="abc").update(name="xyz")
然后动态检查内容。
为此,让类不在list元素中(可能为null),但在List本身中是很好的。
通常创建一个包含不同类型列表的类,并返回该列表,其中一个列表为空。
答案 1 :(得分:1)
要使这个技巧发挥作用,Java需要以某种方式找出实际上是GenericType
类型的方法。当您在代码中显式调用方法并将其结果分配给变量时,就像在您链接的答案中一样,它可以推断出GenericType
是变量的类型。这是在编译时完成的,Java很好用。
像你这样的宁静终点并没有这样做。您的REST提供程序必须使用反射在运行时确定类型,并且不需要执行此操作所需的信息。首先,没有非反射性的代码内调用来推断类型信息,而对于另一种类型,擦除会在编译过程中丢弃它。
幸运的是,无论如何,实际上并不需要这样做。两个可能的返回值都是List
类型。只需将方法声明为返回List
。