Java中, 经常会碰到这样一个设计, 一个类需要外部传入一个List<Shape> 泛型List属性, 这样就可以在不同使用场景中传入不同的List, 可能会传入 List<Circle>, 也可以会传入 List<Rect>.
虽然Circle 类是Shape类的子类, 但 List<Circle> 却不是 List<Shape> 的子类, 所以普通类是不能直接真支持List<T>属性的, 下面是一个变通的方法, 另一个是将这个普通类改造成泛型类.
下面是普通类支持List<T>属性的方法, 核心做法是:
1. setter 采用 Object[] 传入数据;
2. 在返回List<T>的方法中, 需要传入一个T[].class 类型参数, 这样能直接返回List<T> data.
⒊ 为了能让这个普通类知道List<T>每个元素的具体类型, 再增加一个 setter
package test; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Test { public static void main(String[] args) throws IOException { //准备List<T> 数据 List<String> myList=new ArrayList<String>(); myList.add("abc"); ListTProcessor processor=new ListTProcessor(); //将List<T>转成数组形式, set到ListTProcessor目标对象中 processor.setMyListData(myList.toArray()); processor.setMyItemClazz(String.class); //从ListTProcessor获取原来的List<T>, 需要传入 Circle[].class List<String> myList2=processor.getMyList(String[].class); System.out.println(myList2.get(0)); System.in.read(); } } /** * 包含List<T> */ class ListTProcessor { private Object[] myListData; private Class myItemClazz ; public Class getMyItemClazz() { return myItemClazz; } /** * 传入 List 中每个元素的类型, 以便在 ListTProcessor 随时知道元素类型 * @param myItemClazz */ public void setMyItemClazz(Class myItemClazz) { this.myItemClazz = myItemClazz; } public Object[] getMyListData() { return myListData; } /** * 以 Object[] 的方式, 将 List<T>的内容存入 * @param myListData */ public void setMyListData(Object[] myListData) { this.myListData = myListData; } /** * 获取List<T> * @param clazz, 需要将T[].class 类型传入, 比如 Circle[].class */ public <T> List<T> getMyList(Class<? extends T[]> clazz) { //将object[] 转成 T[] 数组 T[] array1 = Arrays.copyOf(myListData, myListData.length, clazz); List<T> lst = Arrays.asList(array1); return lst; } }