簡體   English   中英

使用Java中的varargs創建通用數組的潛在風險是什么?

[英]What are potential risks of creating generic array with varargs in Java?

我發現了一種使用varargs和匿名內部類創建內聯泛型數組的方法:

import java.util.Arrays;
import java.util.Objects;

public class GenericArrayCreate<C> {

   public void method() {

      C[] ans = new Object() { C[] c(int length, C ... cs) { return Arrays.copyOf(cs, length); }}.c(10);

      System.out.println(ans.length);
      System.out.println(Objects.toString(ans));

   }

   public static void main(String[] args) {
      new GenericArrayCreate<Class<? extends Integer>>().method();
   }
}

Java編譯器不會對此代碼產生任何警告,而代碼檢查(在IntelliJ中)則表示:

Unchecked generics array creation for varargs parameter

這里發生了什么,為什么發誓?

在內部,您正在創建一個“對象”數組而不是“C”數組

試試這段代碼:

 public static <C>  C[]  method(int number) {
   return  new Object() { 
     C[] create(int length, C ... cs) {
       return Arrays.copyOf(cs, length); 
     }
   }.create(number);
 }

 public static void main(String[] args) {
   System.out.println(Main.<Integer>method(10));
   System.out.println(new Integer[10]);
 }

[Ljava.lang.Object; @ 6bc7c054

[Ljava.lang.Integer; @ 232204a1

如你所見,它們不一樣。

這很危險,因為如果你運行這樣的東西:

 public static void main(String[] args) {
   Integer[] integerArray1 = Main.<Integer>method(10);
   Integer[] integerArray2 = new Integer[10];
 }

你會有一個ClassCastException

[Ljava.lang.Object; 無法轉換為[Ljava.lang.Integer

如果你想創建任何類型的數組,你需要發送類來構造數組,你可以這樣做:

public static <C>  C[]  method(Class<C> clazz, int number) {
  return  (C[]) Array.newInstance(clazz, number);
}

public static void main(String[] args) {
  Integer[] integerArray1 = Main.<Integer>method(Integer.class, 10);
  Integer[] integerArray2 = new Integer[10];
}

代碼檢查會注意到因為varargs是用數組實現的,而數組不支持泛型。 但您可以通過添加以下內容來抑制該警告:

@SuppressWarnings("unchecked")

發生這種情況的原因是它可能導致信息丟失。 你可以在這里閱讀更多相關信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM