Si consideri il seguente codice:Perché il metodo di chiamata con ritorno generico su una classe generica è considerato non sicuro da javac?
public class Main {
public static class NormalClass {
public Class<Integer> method() {
return Integer.class;
}
}
public static class GenericClass<T> {
public Class<Integer> method() {
return Integer.class;
}
}
public static void main(String... args) {
NormalClass safeInstance = new NormalClass();
Class<Integer> safeValue = safeInstance.method();
GenericClass unsafeInstance = new GenericClass();
Class<Integer> unsafeValue = unsafeInstance.method();
}
}
Se compilo con:
$ javac -Xlint:unchecked Main.java
Restituisce:
Main.java:16: warning: [unchecked] unchecked conversion
Class<Integer> unsafeValue = unsafeInstance.method();
^
required: Class<Integer>
found: Class
1 warning
Si prega di notare che solo il metodo generico è considerato pericoloso, anche se nessun tipo generico è referenziato sul tipo di reso.
È un errore javac
? O c'è una ragione più profonda per questo che non sto prendendo in considerazione?
Non conosco il motivo, ma succede solo se la classe generica in cui è dichiarato il metodo è un tipo non elaborato. – Bubletan
Ho ricevuto l'errore su GenericClass unsafeInstance = new GenericClass(); anziché. Questo perché hai istanziato un tipo generico senza argomenti di tipo. –
Perché quando si sceglie di utilizzare i tipi non elaborati, si sta sostanzialmente dicendo al compilatore che si desidera essere in una modalità legacy non tipicamente. Non usare tipi grezzi. Leggi http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use-it –