Hallo,
ich habe eine generische Klasse (Call<T>), welche eine generische Liste enthält (fest definiert).
Wenn ich in einer anderen Klasse bin und ich die Klasse Call ohne den generischen Typ erzeuge, ist meine Liste, die ja innerhalb der Klasse Call fest generisch ist, auch ohne Typ.
Hier mal ein Beispiel:
Unten in dem Handler kann ich nicht auf den generischen Typ der Liste zugreifen. Warum kann ich das nicht? Der Typ ist doch fest definiert und unabhängig vom Typ T der Klasse Call?
Warum kann ich da nicht auf den konkreten Typ zugreifen? Mir erscheint das unlogisch.
Gebe ich Call aber den Typ T an, dann funktioniert es wunderbar.
Hab ich da einen Denkfehler? Muss bei einer generischen Klasse immer der Typ angegeben werden damit auch die innerhalb der Klasse defnierten "konkreten Listen" auch funktionieren?
Oder handelt es sich dabei eher um einen Java-Bug? Ich habe diesen Code in Eclipse wie auch Netbeans probiert. Bei beiden wurde es meiner Ansicht nach falsch angzeigt (wobei die ja auch nur die Compilerwarnung ausgegben).
Mit Sichherheit kann ich das ganze Zeug nachher casten, aber es geht hierbei eher um das Prinzip warum und wieso.
Hoffe man versteht was ich meine.
MfG
Meru
ich habe eine generische Klasse (Call<T>), welche eine generische Liste enthält (fest definiert).
Wenn ich in einer anderen Klasse bin und ich die Klasse Call ohne den generischen Typ erzeuge, ist meine Liste, die ja innerhalb der Klasse Call fest generisch ist, auch ohne Typ.
Hier mal ein Beispiel:
Unten in dem Handler kann ich nicht auf den generischen Typ der Liste zugreifen. Warum kann ich das nicht? Der Typ ist doch fest definiert und unabhängig vom Typ T der Klasse Call?
Java:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
interface DependencyValue{
void setValue(Object o);
}
abstract class Call<T>{
private List<DependencyValue> list = new ArrayList<DependencyValue>();
protected T result;
abstract public void call();
public T getResult(){
return this.result;
}
public List<DependencyValue> getDepCallValueList() { // fest definiert, also NICHT abhängig von Typ T
return this.list;
}
/*
* und noch vieles, vieles mehr
*/
}
class ConcreteCall extends Call<String>{ // nur der Vollständigkeit halber mit gepostet, trägt aber nicht zum Problem bei
@Override
public void call() {
// super.result = rufe irgendetwas tolles auf
}
/*
* und noch vieles, vieles mehr
*/
}
class Handler{
private LinkedList<Call> callList = new LinkedList<Call>();
void run(){
Call call = callList.removeFirst();
for (int i=0; i < call.getDepCallValueList().size(); i++){
call.getDepCallValueList().get(i)./* warum gibt es hier nicht die Mehtode setValue? */;
}
// oder
List<DependencyCallValues> blub = call.getDepCallValueList();
// Type safety: The expression of type List needs unchecked conversion to conform to List<DependencyCallValues>
}
}
Warum kann ich da nicht auf den konkreten Typ zugreifen? Mir erscheint das unlogisch.
Gebe ich Call aber den Typ T an, dann funktioniert es wunderbar.
Java:
class Handler{
private LinkedList<Call> callList = new LinkedList<Call>();
void run(){
Call<String> call = callList.removeFirst(); // hier nun konkret der Typ T
for (int i=0; i < call.getDepCallValueList().size(); i++){
call.getDepCallValueList().get(i).setValue("blub"); // es geht ohne Probleme
}
// oder
List<DependencyCallValues> blub = call.getDepCallValueList(); // es kommt kein Warning mehr
}
}
Hab ich da einen Denkfehler? Muss bei einer generischen Klasse immer der Typ angegeben werden damit auch die innerhalb der Klasse defnierten "konkreten Listen" auch funktionieren?
Oder handelt es sich dabei eher um einen Java-Bug? Ich habe diesen Code in Eclipse wie auch Netbeans probiert. Bei beiden wurde es meiner Ansicht nach falsch angzeigt (wobei die ja auch nur die Compilerwarnung ausgegben).
Mit Sichherheit kann ich das ganze Zeug nachher casten, aber es geht hierbei eher um das Prinzip warum und wieso.
Hoffe man versteht was ich meine.
MfG
Meru