我声明了一些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)**.
哪种方式可以做我打算做的事情?
答案 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)
您应该使用参数化列表,正如编译器所说。在您的情况下,您可以使用Integer
和Double
- Number
的超类型,因此您的方法签名将如下所示
public ArrayList<Number> getList(String nameOfList)
更好的是,如果没有充分的理由,请不要使用具体的List实现作为返回类型 - 使用所有列表的公共接口 - List
,将签名更改为
public List<Number> getList(String nameOfList)
此建议背后的原因或原则是Dependency inversion principle,SOLID 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;
}