Кастинг из списка в коллекцию - PullRequest
0 голосов
/ 10 ноября 2011

У меня есть класс TreeNode:

public abstract class TreeNode<T>{
   .
   .
   .

    public Collection<TreeNode<T>> children;

    public void clear(){
       if(children == null) 
      return;

       Iterator<TreeNode<T>> iterator = children.iterator();
       while(iterator.hasNext()){
          TreeNode<T> node = iterator.next();
          node.clear();
       }

       children.clear();
   }
   .
   .
   .

}

Затем у меня есть класс ListTreeNode:

public class ListTreeNode<T> extends TreeNode<T>{
   .
   .
   .

   public ListTreeNode(T data, List<ListTreeNode<T>> children){
      this.data = data;
      this.root = null;
      this.children = children;
      this.childIndex = 0;
   }

   .
   .
   .

}

Я получаю сообщение об ошибке компилятора о том, что я не могу преобразовать из List<ListTreeNode<T>> в Collection<TreeNode<T>>.Разве я не смогу, так как List является подынтерфейсом Collection, а ListTreeNode является подклассом TreeNode?Кроме того, у меня есть соответствующий класс SetTreeNode, который использует Set вместо List, и в соответствующем конструкторе, где у меня есть this.children = children;.

, нет ошибок.

Ответы [ 2 ]

2 голосов
/ 10 ноября 2011

A List<String> не является List<Object>.Если бы это было так, вы могли бы сделать это:

List<String> listOfStrings = new ArrayList<String>();
List<Object> listOfObjects = listOfStrings;
listOfObjects.add(new Integer(3));

Как видите, это нарушит безопасность типов типовых коллекций.

Возможно, вам следует использовать Collection<? extends TreeNode<T>>

1 голос
/ 10 ноября 2011

Эта проблема не имеет ничего общего с приведением List<T> к Collection<T>, и все, что связано с приведением List<SomeDerivedClass> к List<SomeBaseClass>.Обобщения Java инвариантны , и вы ищете поведение ковариация .

Этот вопрос неоднократно поднимался ранее в StackOverflow.Вот один пример: Является ли List<Dog> подклассом List<Animal>?Почему дженерики Java не являются полностью полиморфными?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...