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;
    }
    
 
}
复制代码

 

posted @   harrychinese  阅读(2368)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2019-01-30 禅道项目管理系统
点击右上角即可分享
微信分享提示