Sto cercando di capire i diversi risultati di compilazione di codice apparentemente analogo. Sembra che sia possibile trasmettere un List<Object>
a List<T>
ma solo se T
non è limitato da una classe concreta. Quindi, dato ...Cast elenco di oggetti da elencare di classe 'parametro di tipo
List<Object> bis = new ArrayList<>();
I seguenti compila in class Test<T>
così come in class Test<T extends CharSequence>
ma non in class Test<T extends BigDecimal>
né class Test<T extends BigDecimal & CharSequence>
.
List<T> result = (List<T>) bis;
Così dove la differenza proviene da per T
delimitata con un tipo di classe e di un tipo di interfaccia?
Edit:
Alcuni codice completo per ogni richiesta. Si compila con un avviso del compilatore nella riga 9. Non è infatti sicuro operare su articoli di result
come se fossero istanze di CharSequence
risultati in un ClassCastException
.
public class Sandbox<T extends CharSequence> {
public static void main(String[] args) {
new Sandbox<CharSequence>().foo();
}
private void foo() {
List<Object> bis = Arrays.asList(Integer.valueOf(1));
List<T> result = (List<T>) bis;
System.out.println(result);
}
}
Tuttavia, questo non può essere compilato a tutti:
public class Sandbox<T extends BigDecimal> {
public static void main(String[] args) {
new Sandbox<BigDecimal>().foo();
}
private void foo() {
List<Object> bis = Arrays.asList(Integer.valueOf(1));
List<T> result = (List<T>) bis;
System.out.println(result);
}
}
errore del compilatore in linea 9: non può lanciare List<Object>
a List<T>
.
Richiede più codice. Puoi dare la (e) linea (e) esatta (i) che sta fallendo per te? – markspace
Non è sicuro digitare cast 'List
La versione 'T extends CharSequence' non viene compilata. https://ideone.com/ySVuPr –