zoukankan      html  css  js  c++  java
  • Java: 非泛型类如何设计List<T>这样的属性

    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;
        }
        
     
    }
  • 相关阅读:
    [cdq分治][树状数组] Bzoj P3262 陌上花开
    [Prufer序列] Bzoj P4766 文艺计算姬
    [欧拉回路][并查集] Bzoj P3706 反色刷
    [欧拉回路][dfs] Uoj #117 欧拉回路
    [并查集][Tarjan] Bzoj P5017 炸弹
    day18
    day17
    树形DP学习笔记
    [分治]JZOJ 6308 中间值
    [贪心][完全背包]JZOJ 6309 完全背包
  • 原文地址:https://www.cnblogs.com/harrychinese/p/14350890.html
Copyright © 2011-2022 走看看