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