Java:如何使列表类型采用变量参数

时间:2016-08-10 12:25:08

标签: java generics

我有一个这样的课程

class Dummy{
    public getData(Info info){
        List<SomeType> list = info.getDataAsPerInfo();

        List<SomeType> result=new List<>();  

        for(SomeType someType: list){
            // extracting data from someType, lets say this data is 
            // resType (it also of SomeType)
            result.add(resType);  
        }
    }

    public static void main(String args[]){
        Info1 info = new Info1();   // Info1 extends Info
        // adding paramters to info
        new Dummy().getData(info);
    }
}

现在问题是我有几个Info类,如Info1, Info2 ... 并且getData方法可能会返回不同类型的列表。我不知道如何在不重写每个Info类的代码的情况下实现这一目标(这将涉及用该类的返回类型替换SomeType&getdataAsPerInfo函数)。 有没有一种方法可以根据传递给getData函数的Info类型以某种方式使用SomeType?在这种情况下,最好的方法是什么?谢谢 !!

3 个答案:

答案 0 :(得分:2)

请查看Generics的Oracle教程。

您不仅可以将一个特定类定义为列表元素的类型,还可以定义实现特定接口的类或类的系列。

编辑以纳入评论。

Info.getDataAsPerInfo()根据使用的InfoX类返回不同对象的列表时,这将是通用接口的用例。

public interface Info<T> {
    List<T> getDataAsPerInfo();
}

实现如:

public class Info1 implements Info<SomeType> 

public class Info2 implements Info<SomeOtherType>

然后你的Dummy - 类看起来像

class Dummy {
    public getData(Info<T> info) {
        List<T> list = info.getDataAsPerInfo();

        List<T> result=new List<>();  

        for(T someType: list){
            // extracting data from someType, lets say this data is 
            // resType (it also of SomeType)
            result.add(resType);  
        }
    }

    public static void main(String args[]){
        Info1 info = new Info1();   // Info1 extends Info<SomeType>
        // adding paramters to info
        new Dummy().getData(info);
    }
}

答案 1 :(得分:1)

如果每个类的信息是不同类型但是扩展或实现主超类型,则可以使用List&lt; ?扩展类型&gt;哪个会起作用

你总是可以使用List&lt; ? &GT;它返回任何值作为泛型,它基本上是一个未知的对象,所以只需要getData返回List&lt; ? &GT;它应该工作正常,然后检查他们用“instanceof”或其他方式进行输入,这应该适用于你想要实现的目标。

或者对于您正在使用的方法(看起来像),您可以使用T设置,这里是我认为您想要实现的代码片段。

    public <T> List<T> getInfo(T type) {
        // T here would be the type
        return new ArrayList<T>();
    }

你的问题有点含糊不清,所以如果你能解释一下你想要做的更多,那么我可以提供更多的帮助。

答案 2 :(得分:1)

我认为你不需要在这里摆弄仿制药。您正在寻找一种解决方案,您可以在运行时(多态)决定SomeType的功能。看看这个解决方案。

    private interface SomeType {
        void doAThing();
    }

    private class AnotherType implements SomeType {

        @Override
        public void doAThing() {
            System.out.println("AnotherType.doAThing");
        }
    }

    private class OneMoreType implements SomeType {

        @Override
        public void doAThing() {
            System.out.println("OneMoreType.doAThing");
        }
    }

    private abstract class Info {
        public abstract SomeType getDataAsPerInfo();
    }

    private class Info1 extends Info {

        @Override
        public SomeType getDataAsPerInfo() {
            return new AnotherType();
        }
    }

    private class Info2 extends Info {

        @Override
        public SomeType getDataAsPerInfo() {
            return new OneMoreType();
        }
    }

现在您可以从Info返回SomeType并专门实现子类中的功能。