V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhao1014
V2EX  ›  Java

如果要创建一个泛型数组,该怎么做比较好?

  •  
  •   zhao1014 · 2020-12-11 21:18:48 +08:00 · 2319 次点击
    这是一个创建于 1477 天前的主题,其中的信息可能已经有所发展或是发生改变。

    直接强转成泛型数组吗?类似于这样的:

    private final T[] array;
    public ClassName(int length){
    	//这里编译器会有警告
    	array = (T[])new Object[length];
    }
    
    7 条回复    2020-12-12 15:36:22 +08:00
    chocovon
        1
    chocovon  
       2020-12-11 22:06:02 +08:00   ❤️ 2
    Effective Java 里讲过应避免使用泛型数组,用 List 代替
    OldCarMan
        2
    OldCarMan  
       2020-12-11 22:52:50 +08:00   ❤️ 1
    - 参照,Arrays 的 copyOf 方法:

    ```javascript
    public static <T> T[] newArray(int length, Class<? extends T[]> type) {
    return ((Object) type == (Object) Object[].class) ? (T[]) new Object[length] : (T[])Array.newInstance(type.getComponentType(), length);
    }
    ```
    - 使用

    ```javascript
    Integer[] integers = newArray(10, Integer[].class);
    ```
    OldCarMan
        3
    OldCarMan  
       2020-12-11 22:55:07 +08:00
    (⊙﹏⊙) sorry,回复不支持 md 吗?好像也删不了,你讲究看吧。
    hdfg159
        4
    hdfg159  
       2020-12-12 00:09:21 +08:00 via Android
    直接 object 大法
    janus77
        5
    janus77  
       2020-12-12 01:32:30 +08:00
    自己写一个数据结构
    SoloCompany
        6
    SoloCompany  
       2020-12-12 15:32:59 +08:00
    我忘记在哪里的讨论 java 的 Type[] 就是一个 design flaw, 直接导致了和后来的泛型系统不兼容

    要同时使用泛型和数组那就只能使用 Object[], 对于泛型 T, T[] 实际类型就是 Object[]
    SoloCompany
        7
    SoloCompany  
       2020-12-12 15:36:22 +08:00   ❤️ 1
    另外一个可以参考的例子

    https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#toArray-java.util.function.IntFunction-

    方法签名
    <A> A[] toArray(IntFunction<A[]> generator)

    使用
    SomeType[] typedArray = someStreamtoArray(SomeType[]::new);
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   933 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 21:28 · PVG 05:28 · LAX 13:28 · JFK 16:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.