Java 返回任何类型的ArrayList

Java 返回任何类型的ArrayList,java,list,arraylist,Java,List,Arraylist,我声明了一些ArrayLists。其中一些是ArrayList,另一些是ArrayList 我想从另一个类中获取它们,因此我编写了一个方法: private ArrayList<Double> list1, list2; private ArrayList<Integer> list3; public ArrayList getList(String nameOfList){ ArrayList myList = new ArrayList();

我声明了一些
ArrayList
s。其中一些是
ArrayList
,另一些是
ArrayList

我想从另一个类中获取它们,因此我编写了一个方法:

private ArrayList<Double> list1, list2;
private ArrayList<Integer> list3;

    public ArrayList getList(String nameOfList){
        ArrayList myList = new ArrayList();
        if(nameOfList.equals("list1")) myList = list1;
        else if(nameOfList.equals("list2")) myList = list2;
        else if(nameOfList.equals("list3")) myList = list3;
        return myList;
    }
私有数组列表list1、list2;
私有数组列表3;
公共ArrayList getList(字符串名称列表){
ArrayList myList=新的ArrayList();
如果(nameOfList.equals(“list1”))myList=list1;
如果(name of list.equals(“list2”))myList=list2;
如果(nameOfList.equals(“list3”))myList=list3;
返回myList;
}
这会编译,但会给我一些警告:

*ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized* in the method above, and *Type safety: The expression of type ArrayList needs unchecked conversion to conform to List<? extends Number>* when calling the method from here:

    XYSeries series = new SimpleXYSeries(data.getList("list1"), data.getList("list2"), "My chart");

where SimpleXYSeries is a chart whose constructor expects to be getting **(List<? extends Number>, List<? extends Number>, String)**.

*ArrayList是原始类型。对泛型类型ArrayList的引用应在上述方法中参数化*和*类型安全性:类型ArrayList的表达式需要未经检查的转换以符合列表我建议您尝试以下签名

public <T> List<T> getList(Class<T> clazz);
公共列表getList(类clazz);

是,每个字段使用一个getter

public List<String> getList1() { return list1; }
public List<String> getList2() { return list2; }
public List<Integer> getList3() { return list3; }

XYSeries series = new SimpleXYSeries(data.getList1(), data.getList2(), "My chart");
public List getList1(){return list1;}
公共列表getList2(){return list2;}
公共列表getList3(){return list3;}
XYSeries系列=新的SimpleXYSeries(data.getList1(),data.getList2(),“我的图表”);

使用多种方法,而不是一种方法。


有一个
getList
方法使用
String
来选择成员,这是一个糟糕的设计。相反,应该有多个方法-每个列表一个。然后每个方法都可以返回适合其列表的类型。

希望您使用Java5。可以使用泛型声明该方法

public ArrayList<? extends Object> getList(String nameOfList) {
    ArrayList<? extends Object> myList = null;
    if (nameOfList.equals("list1"))
        myList = list1;
    else if (nameOfList.equals("list2"))
        myList = list2;
    else if (nameOfList.equals("list3"))
        myList = list3;
    return myList;
}

public ArrayList正如编译器所说,您应该使用参数化列表。在您的情况下,您可以使用
整数
双精度
-
数字
的超类型,因此您的方法签名看起来像

public ArrayList getList(字符串名称列表)

更好的是,如果没有很好的理由,不要使用具体的列表实现作为返回类型-使用所有列表的公共接口-
List
,将签名更改为

public List getList(String name of List)


此建议背后的原因或原则是,

的“D”考虑使用
ArrayList
来同时保存Double和Integer,因为它是Double和Integer的父类。

推荐的方法是为每个列表分别设置getter

如果您真的想坚持使用单getter方法,您可以根据需要调整方法签名(以及相应的实现)

public ArrayList getList(字符串名称列表)
并在调用该方法时显式指定


或者通过一门
课程
,正如Johan所建议的那样

这不是最好的建议,但考虑到你的情况,我会将我的方法改为:

public ArrayList<? extends Number> getList(String nameOfList){
    ArrayList<? extends Number> myList = new ArrayList<Number>();
    if(nameOfList.equals("list1")) myList = list1;
    else if(nameOfList.equals("list2")) myList = list2;
    else if(nameOfList.equals("list3")) myList = list3;
    return myList;
}
publicArrayList您可以这样做

public ArrayList<? extends Object> getList(String nameOfList){

     if(nameOfList.equals("list1")) return list1;

     if(nameOfList.equals("list2")) return list2;

     return list3;    
}

public ArrayList+1,用于指出设计不佳,应重新考虑。
public ArrayList<? extends Object> getList(String nameOfList){

     if(nameOfList.equals("list1")) return list1;

     if(nameOfList.equals("list2")) return list2;

     return list3;    
}