Java动态方法返回类型

时间:2016-03-04 23:10:35

标签: java spring arraylist

编辑 我本来应该为那些试图帮助回答这个问题的人提到这个,但是这个方法(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的新手,这是我第一次使用泛型方法。如果它有帮助,那么返回的列表本身就不是动态的。此方法应该始终返回这两个特定列表中的一个。

2 个答案:

答案 0 :(得分:1)

Java无法做到(通常)。

用法是:

SomeModel.objects.filter(name="abc").update(name="xyz")

然后动态检查内容。

为此,让类不在list元素中(可能为null),但在List本身中是很好的。

通常创建一个包含不同类型列表的类,并返回该列表,其中一个列表为空。

答案 1 :(得分:1)

要使这个技巧发挥作用,Java需要以某种方式找出实际上是GenericType类型的方法。当您在代码中显式调用方法并将其结果分配给变量时,就像在您链接的答案中一样,它可以推断出GenericType是变量的类型。这是在编译时完成的,Java很好用。

像你这样的宁静终点并没有这样做。您的REST提供程序必须使用反射在运行时确定类型,并且不需要执行此操作所需的信息。首先,没有非反射性的代码内调用来推断类型信息,而对于另一种类型,擦除会在编译过程中丢弃它。

幸运的是,无论如何,实际上并不需要这样做。两个可能的返回值都是List类型。只需将方法声明为返回List