Dal secondo esempio, sto indovinando questo metodo viene definito in una classe qualcosa di generico come questo:
class SomeClass<T> {
public void createArray(T sample){ ... }
}
La differenza tra il primo e il secondo esempio è che nel primo esempio, il T
è efficace una variabile di tipo "locale". Potresti dargli un nome diverso, ad es. S
, per renderlo un po 'più chiaro:
class SomeClass<T> {
public <S> void createArray(S sample){ ... }
}
Così, S
e T
sono entrambe le variabili di tipo, ma sono indipendenti. T
è definito nell'ambito della classe e quindi può essere utilizzato per fare riferimento allo stesso tipo tra tutti i metodi della classe; S
è definito solo nell'ambito del metodo.
Utilizzando il nome T
anziché S
, si nasconde la variabile del tipo di livello di classe, T
. Questo significa che, per esempio, la seguente non funzionerebbe:
class SomeClass<T> {
public T getWotsit() { ... }
public <T> void createArray(T sample){
T wotsit = getWotsit();
}
}
perché il T
nella firma del getWotsit
e T
nella dichiarazione di variabili T wotsit
potenzialmente riferiscono a differenti tipi; questo è più chiaro se si utilizza il nome S
di scrivere il codice equivalente:
class SomeClass<T> {
public T getWotsit() { ... }
public <S> void createArray(S sample){
S wotsit = getWotsit();
}
}
Per quanto io sappia, non c'è modo di fare riferimento alla variabile di tipo a livello di classe se hai definito un variabile di tipo method-level con lo stesso nome.
Tuttavia, entrambi i seguenti andrebbe bene:
class SomeClass<T> {
public T getWotsit() { ... }
// No additional type variable, so T is the class-level type variable.
public void createArray(T sample){
T wotsit = getWotsit();
}
}
class SomeClass<T> {
public T getWotsit() { ... }
// Type variable has different name, so `T` is the class-level
// type variable.
public <S> void createArray(T sample){
T wotsit = getWotsit();
}
}
La risposta data sono probabilmente ragione, ma si noti che, così com'è, il vostro 'createArray' nel secondo frammento di non viene compilato. – Tunaki