gpt4 book ai didi

Java动态方法返回类型

转载 作者:行者123 更新时间:2023-11-30 03:01:39 27 4
gpt4 key购买 nike

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

我有一个采用字符串变量作为参数的方法。我想要实现的功能是,根据该字符串变量的值,该方法将构造两个不同列表中的一个,并返回该列表。这可能吗?我尝试使用通用方法,就像第三个答案中的人一样,从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 注释只是 spring 配置的东西,所以你可以忽略它,因为它与问题无关。不管怎样,我觉得这比我想象的要简单得多,但我对 Java 还很陌生,这是我第一次使用泛型方法。如果有帮助的话,返回的列表本身并不是动态的。此方法应该仅且始终返回这两个特定列表中的 1 个。

最佳答案

为了让这个技巧发挥作用,Java 需要有一种方法,以某种方式确定 GenericType 实际是什么类型。当您在代码中显式调用方法并将其结果分配给变量时(如您链接到的答案中所示),它可以推断 GenericType 是变量的类型。这是在编译时完成的,Java 对此没问题。

像您所做的那样的 Restful 端点不具备这一点。您的 REST 提供程序必须使用反射在运行时确定类型,而执行此操作所需的信息却不存在。一方面,没有非反射代码内调用来推断类型信息,另一方面,类型删除无论如何都会在编译期间丢弃它。

幸运的是,实际上根本没有必要这样做。两个可能的返回值都是 List 类型。只需将该方法声明为返回List即可。

关于Java动态方法返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35807752/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com