[英]Java unchecked: unchecked generic array creation for varargs parameter
[英]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.