zhao1014
V2EX  ›  Java

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

  •  
  •   zhao1014 · Dec 11, 2020 · 2947 views
    This topic created in 2005 days ago, the information mentioned may be changed or developed.

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

    private final T[] array;
    public ClassName(int length){
    	//这里编译器会有警告
    	array = (T[])new Object[length];
    }
    
    7 replies    2020-12-12 15:36:22 +08:00
    chocovon
        1
    chocovon  
       Dec 11, 2020   ❤️ 2
    Effective Java 里讲过应避免使用泛型数组,用 List 代替
    OldCarMan
        2
    OldCarMan  
       Dec 11, 2020   ❤️ 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  
       Dec 11, 2020
    (⊙﹏⊙) sorry,回复不支持 md 吗?好像也删不了,你讲究看吧。
    hdfg159
        4
    hdfg159  
       Dec 12, 2020 via Android
    直接 object 大法
    rb6221
        5
    rb6221  
       Dec 12, 2020
    自己写一个数据结构
    SoloCompany
        6
    SoloCompany  
       Dec 12, 2020
    我忘记在哪里的讨论 java 的 Type[] 就是一个 design flaw, 直接导致了和后来的泛型系统不兼容

    要同时使用泛型和数组那就只能使用 Object[], 对于泛型 T, T[] 实际类型就是 Object[]
    SoloCompany
        7
    SoloCompany  
       Dec 12, 2020   ❤️ 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);
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3333 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 12:48 · PVG 20:48 · LAX 05:48 · JFK 08:48
    ♥ Do have faith in what you're doing.