|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
[JAVA] Capire alcuni punti del JLS
Sto leggendo il JLS (Java Language Specification) e ci sono dei punti nella sezione §5.5 Casting Conversion che non capisco. So che sono cose molto particolari e specifiche ma se qualcuno è in grado di spiegarle, ringrazio in anticipo.
Ad un certo punto dice: A cast from a type S to a parameterized type (§4.5) T is unchecked unless at least one of the following conditions hold: * S <: T.I primi due punti mi sono molto chiari, il terzo (evidenziato in rosso) no. In pratica dice che il cast non è unchecked se la condizione è che: T è un sottotipo di S (quindi è un down-cast) e S non ha un sottotipo X diverso da T tale che le erasure di X e T sono le stesse. Cioè?? Solo con la prima parte (T <: S) un esempio sarebbe facile da fare: Codice:
class Super { }
class Sub<T> extends Super { }
Super sup = new Sub<String> ();
Sub<String> sub = (Sub<String>) sup;
--------------------------- Altro punto, sempre in §5.5 un po' più sotto: The detailed rules for compile-time legality of a casting conversion of a value of compile-time reference type S to a compile-time reference type T are as follows: * If S is a class type: * If T is a class type, then either |S| <: |T|, or |T| <: |S|; otherwise a compile-time error occurs. Furthermore, if there exists a supertype X of T, and a supertype Y of S, such that both X and Y are provably distinct parameterized types (§4.5), and that the erasures of X and Y are the same, a compile-time error occurs. Anche qui la prima parte mi è chiara, S e T devono essere in "linea di ereditarietà" (String e Integer ad esempio non lo sono). La parte successiva (evidenziata in rosso) no, non mi è chiara. Anche qui un esempio sarebbe utile.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Per il primo punto io capisco:
S non ha un sottotipo con la stessa erasure di T, esempio: Set<String> e Set<Integer> sono tipi diversi, ma con uguale erasure (Set), e se S è ad es. Object il cast sarà unchecked, perche' Object ha come sottotipi tutti i Set di tutti gli oggetti. Se invece la conversione è "univoca" il cast è checked... Prendi ad esempio il codice: Codice:
List<Integer> l = new ArrayList<Integer>(); ArrayList<Integer> al = (ArrayList<Integer>) l; ad esempio di ArrayList<String>, che avrebbe la stessa erasure... In conclusione direi che se S è parametrico il cast è checked, altrimenti è unchecked. Non ti so dire di piu', il mio cervello si ferma qui
__________________
|Java Base| |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Esempio per il secondo punto:
siano X = List<Integer> e Y = List<String> (tipi distinti, stessa erasure); qualsiasi conversione tra un sottotipo di X e uno di Y fallisce. Questo dice la frase in rosso. Potrei aver detto un sacco di fregnacce, quindi non ti fidare troppo
__________________
|Java Base| |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Intanto grazie per la risposta.
Quote:
Tu invece hai fatto l'esempio di S e T entrambi parametrizzati, quindi è un'altra cosa, deduco io. Ci devo ragionare un pochino ... non sono sicuro al 100% che sia quel caso (ma potrei anche sbagliarmi).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Quote:
Come hai detto tu T è certamente parametrizzato, S no. Naturalmente posso sbagliarmi, anche perché non si capisce perché hanno usato quei giri di parole, ma l'unico caso che mi viene in mente è quello...
__________________
|Java Base| |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Qui si parla di una "unchecked conversion", che per definizione (§5.1.9) è: "There is an unchecked conversion from the raw type (§4.8) G to any parameterized type of the form G<T1 ... Tn>" Ci sono dei casi in cui appunto pur passando da un raw type a un parameterized type non è unchecked. Un esempio del primo caso (S <: T) è: Codice:
class StringList extends ArrayList<String> { }
ArrayList<String> t1 = new StringList (); // non è unchecked
Codice:
ArrayList<?> t2 = new ArrayList (); // non è unchecked E poi c'è 'sto terzo caso ......
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
In realtà questa (la prima che avevi postato, 3o paragrafo primo post)
è la definizione di cast unchecked, e non di unchecked conversion...
__________________
|Java Base| |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:18.











|








