Ich versuche ein Netzwerk von Knoten zu programmieren, wobei jeder Knoten eine Liste von Referenzen auf einen anderen Knoten enthält. Node ist eine abstrakte Klasse, daher verweisen die Listen auf Node-Children.Referenzieren von Objekten mit begrenzten Typen
Die abstrakte Knoten-Hauptklasse - enthält eine Liste von Eingabetypen (die selbst eine Liste von Knoten dieses Typs ist). Da die Klasse abstrakt ist, kann ich nur eines ihrer Kinder instanziieren.
public abstract class Node {
ArrayList<Input<? extends Node>> inputs;
public Node(){
inputs = new ArrayList<Input<? extends Node>>();
}
public ArrayList<Input<? extends Node>> getInputNodes(){
return(inputs);
}
public void killConnections() {
for(Input<? extends Node> i:inputs){
i.removefromInput(this);
}
}
public abstract void something(); //not too important in this context....
}
Ich habe verschiedene Arten von Objekten, die als Eingabe fungieren. Verschiedene untergeordnete Knoten() können verschiedene Arten von Eingaben haben. Ich erstelle daher eine Eingabeklasse, die auf einem generischen Typ funktioniert. Die Eingangsklasse, eine Liste von Referenzen auf andere Objekte enthält, von Knoten zu erben, sieht wie folgt aus:
public class Input<T extends Node> {
ArrayList<T> inputs;
public Input(){
inputs = new ArrayList<T>();
}
public void removefromInput(T obj){
inputs.remove(obj);
}
public void addToInput(T obj){
inputs.add(obj);
}
public ArrayList<T> getInputs(){
return inputs;
}
}
Schließlich meine eigentliche Knotenklasse implementiert. Dies ist einer von mehreren Kindknoten, jedes Kind hat möglicherweise einen anderen Satz von Eingabetypen, die ich im Konstruktor definiere.
public class ExplicitNode extends Node {
boolean active;
public ExplicitNode(ExplicitNode inputNode){
active = true;
inputs.add(new Input<ExplicitNode>());
inputs.get(0).addToInput(inputNode); //***Here i get an error
}
public void someMethod() {
if(!inputs.get(0).getInputs().isEmpty()){
for(int i = 0; i< inputs.get(0).getInputs().size(); i++){
//***Here i get an error too
if(inputs.get(0).getInputs().get(i).active){ .
//do something....,
}
}
}
}
ich folgende Fehlermeldung erhalten:
The method addToInput(capture#1-of ? extends Node) in the type Input is not applicable for the
arguments (ExplicitNode)
Der zweite Fehler auch (Das Feld „aktiv“ nicht aufgelöst werden kann) mich verwirrt - ich instanziiert einen Eingang vom Typ <ExplicitNode>
, damit die Arraylist des Eingangs sollte auch Objekte des Typs ExplicitNode
zurückgeben, die das "aktive" Feld ??
Was mache ich falsch?
'die Eingabe des Arraylist auch sollte um nicht bekommen ... Objekte des Typs ExplicitNode' - nein, weil yo Sie parametrisieren die 'ArrayList' nicht als solche. –
Ich dachte, dass, wenn ich "Input" im Klassenheader hat, das T innerhalb "ArrayList Eingaben" im Körper bereits als erben von Node verstanden wird. Wenn also die Eingabe erstellt wird, enthält die ArrayList daher Objekte vom Typ ExplicitNode. –
user3641187