В данном графике важным требованием является то, что все элементы должны быть изготовлены из тех же типов или подтипов, т. Е. График бетонода может иметь только определения
prements p>
prements. />
Код: Выделить всё
abstract class Node
class ConcreteNode extends Node
class City extends ConcreteNode
< /code>
Эти определения используют «повторяющийся общий шаблон», также обнаруженную в определении класса Enum: < /p>
Class Enum
Код: Выделить всё
package test.city;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
public class TestCity {
abstract class Node {
public abstract void addNeighbor(T n);
public abstract void addNeighbors(Collection node) {
print("Nodes", node.neighbors());
}
static void printNeighbors2(ConcreteNode node) {
print("Concrete nodes", node.neighbors());
}
static void printNeighbors3(Node> node) {
print("Nodes2", node.neighbors());
}
static void printNeighbors4(ConcreteNode> node) {
print("Concrete nodes2", node.neighbors());
}
static void addNewNeighbors1a(Node node, City newNode) {
node.addNeighbor(newNode);
print("Add city to node", node.neighbors());
}
static void addNewNeighbors1b(Node node, City newNode) {
// node.addNeighbor( newNode ); )
// in the type
// TestCity.Node> is not
// applicable for the arguments
// (TestCity.Node col) {
System.out.println(msg + ": " + Arrays.toString(col.toArray()));
}
}
public static void main(String[] args) {
new TestCity();
}
}
< /code>
Вывод запуска этого кода составляет следующее (вообще без сюрпризов): < /p>
Printing cities: [Boston, Wash]
Nodes: [Boston, Wash]
Concrete nodes: [Boston, Wash]
Nodes2: [Boston, Wash]
Concrete nodes2: [Boston, Wash]
Add city to node: [Boston, Wash, Miami]
Add concrete node to node: [Boston, Wash, Miami, NewOr]
Существует связанная проблема, которую я не включил в исходный пример, потому что я думал, что решение также собирается применить.static T getSomeNeighbor(T node) {
return node.neighbors().iterator().next();
}
< /code>
И из моего основного класса я пробую следующее: < /p>
City someCity = GraphUtil.getSomeNeighbor(nyc);
someCity.addNeighbor(new City("London")); // OK
ConcreteNode someCN1 = GraphUtil.getSomeNeighbor(nyc);
someCN1.addNeighbor(new City("Paris")); // OK, but raw
ConcreteNode someCN2 = GraphUtil.getSomeNeighbor(nyc);
someCN2.addNeighbor(new City("Berlin")); // Does not compile
ConcreteNode nc = new City("");
nc.addNeighbor(new City("Bern")); // Does not compile
< /code>
Первый случай работает, потому что я знаю бетонный тип, который возвращается, и он согласен с типом, представленным в параметре. Второй случай работает, но я использую бетонод необработанных типов. Я использую «Новый город» («-») в качестве параметра, потому что я не знаю, как их повысить. В четвертом случае я попытался поднять город до бетонода, но он потерпел неудачу. Текущая ошибка компилятора является следующей: "Метод addneighbor (захват № 4-о-из?) введите город?>
Подробнее здесь: https://stackoverflow.com/questions/156 ... eric-usage