Рекурсивное общее использованиеJAVA

Программисты JAVA общаются здесь
Anonymous
Рекурсивное общее использование

Сообщение Anonymous »

Обновление: Я получил очень актуальный ответ от «erickson», но есть боковая проблема (восприятие?), Который не был явно покрыт в моем первоначальном примере и не решается с его ответом. Я расширил пример, чтобы охватить эту другую проблему, и я включил ее в конце этого поста. Я думал, что нашел решение после прочтения ответа от Джона Скита на этот вопрос «Определение Java enum». Тем не менее, я оказался с разными проблемами, когда пытался применить его в своем коде. Я надеюсь, что будет достаточно ясно, чтобы проиллюстрировать мои вопросы. Я определил абстрактный класс node , который определяет некоторые основные методы, и конкретный класс, который реализует эти методы, а именно concetenode . Я также создал специализацию ConceteNode, называемую City .
В данном графике важным требованием является то, что все элементы должны быть изготовлены из тех же типов или подтипов, т. Е. График бетонода может иметь только определения
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

Вернуться в «JAVA»