返回任何类型的ArrayList

时间:2011-12-05 12:46:55

标签: java list arraylist

我声明了一些ArrayList。其中一些是ArrayList<Integer>,另一些是ArrayList<Double>

我想从另一个类中获取它们,所以我写了一个方法:

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;
    }

这会编译,但会引发一些警告:

*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)**.

哪种方式可以做我打算做的事情?

9 个答案:

答案 0 :(得分:7)

使用多种方法而不是一种上帝方法。

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

答案 1 :(得分:2)

推荐的方法是为每个列表分别使用getter。

如果你真的想坚持单一的getter方法,你可以调整你的方法签名(和相应的实现)

public <T> ArrayList<T> getList( String nameOfList )

并在调用方法时明确指定<T>

或按照约翰

的建议传递Class<T>

答案 2 :(得分:1)

我建议您尝试以下签名

public <T> List<T> getList(Class<T> clazz);

答案 3 :(得分:1)

是的,每场使用一个吸气剂。

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");

答案 4 :(得分:1)

希望您使用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;
}

但我不建议这种设计。你应该有每个方法来获取每个列表。

答案 5 :(得分:1)

您应该使用参数化列表,正如编译器所说。在您的情况下,您可以使用IntegerDouble - Number的超类型,因此您的方法签名将如下所示    public ArrayList<Number> getList(String nameOfList)

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

   public List<Number> getList(String nameOfList)

此建议背后的原因或原则是Dependency inversion principleSOLID principles of software design的“D”

答案 6 :(得分:1)

不是最好的建议,但鉴于你的情况,我会改变我的方法:

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;
}

答案 7 :(得分:0)

考虑使用ArrayList<Number>来保存Double和Integer,因为Number是Double和Integer的父类。

答案 8 :(得分:0)

你可以这样做

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

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

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

     return list3;    
}
相关问题