2016-05-06 10 views
5

ho trovato un modo per creare generica linea array con varargs e anonimo classe interna:Quali sono i potenziali rischi della creazione di array generici con vararg in Java?

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 compilatore non produce alcun avvertimento su questo codice, mentre ispezione del codice (in IntelliJ) dice:

Unchecked generics array creation for varargs parameter 

Cosa sta succedendo qui e perché sta bestemmiando?

risposta

1

L'ispezione del codice noterà che poiché i vararg vengono implementati con l'array e l'array non supporta i generici. Ma è possibile eliminare questo avvertimento con l'aggiunta di questo:

@SuppressWarnings("unchecked") 

motivo per cui questo accade è che può portare alla perdita di informazioni. Puoi leggere ulteriori informazioni su questo here.

3

Internamente si sta creando una serie di "Oggetto", invece di una serie di "C"

provare questo codice:

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

Come si può vedere che non sono la stessa cosa.

È pericoloso perché se eseguire qualcosa come questi:

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

E si avrà una ClassCastException

[Ljava.lang.Object; non può essere gettato a [Ljava.lang.Integer

Se si desidera creare qualsiasi tipo di serie è necessario inviare la classe per costruire la serie, si può fare in questo modo:

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]; 
} 
+0

@ Hai qualche commento sulla mia risposta? – Troncador

Problemi correlati