Ошибка при работе со списком ‹? расширяет DefaultMutableTreeNodel ›

public void findClassNodesMatching(String lowerCaseSearchText, List<? extends DefaultMutableTreeNode> foundNodes) {
    findClassNodesMatching(lowerCaseSearchText, (DefaultMutableTreeNode) getRoot(), foundNodes);
}

private void findClassNodesMatching(String lowerCaseSearchText, DefaultMutableTreeNode node, List<? extends DefaultMutableTreeNode> foundNodes) {
    String nodeLabel = node.toString().toLowerCase();
    if (nodeLabel.indexOf(lowerCaseSearchText) >= 0) {
        foundNodes.add(node);
    }
}

Почему этот код выдает ошибку

Метод add (захват # 2-из? Расширяет DefaultMutableTreeNode) в типе List неприменим для аргументов (DefaultMutableTreeNode)

Ошибка находится в строке foundNodes.add(node);


person Adel Boutros    schedule 30.01.2012    source источник


Ответы (1)


Вы можете добавить в список, где вам известен только тип как ограничение List<? extends Something>. Представьте, что вы можете:

List<Banana> bananas = new ArrayList<Banana>();
// This is fine, right?
List<? extends Fruit> fruit = bananas;

// We don't want to be able to add an apple to a list of bananas!
fruit.add(new Apple());

// ... as otherwise this is no longer safe
Banana bananas = bananas.get(0);

Точно так же и в вашем случае - представьте, что вы прошли в каком-то List<SomeVerySpecificKindOfNode>; вы не сможете добавить к этому ничего DefaultMutableTreeNode.

Непонятно, каков ваш контекст, но простого изменения кода для использования List<DefaultMutableTreeNode> в обоих местах вполне может быть достаточно, чтобы исправить это. Это зависит от звонящих.

person Jon Skeet    schedule 30.01.2012