Может ли ArrayList Node содержать не-Node тип? - PullRequest
0 голосов
/ 16 октября 2008

Может ли ArrayList of Node содержать тип не-Node?

Есть ли очень грязный способ сделать это с приведением типа?

Ответы [ 3 ]

5 голосов
/ 16 октября 2008

Да, но вы получите исключения приведения класса, если попытаетесь получить доступ к неузловому элементу, как если бы он был узлом. Дженерики отбрасываются во время выполнения (за).

Например:

import java.util.*;
import java.awt.Rectangle;

public class test {
    public static void main(String args[]) {
        List<Rectangle> list = new ArrayList<Rectangle>();
        /* Evil hack */
        List lst = (List)list;

        /* Works */
        lst.add("Test");

        /* Works, and prints "Test" */
        for(Object o: lst) {
            System.err.println(o);
        }

        /* Dies horribly due to implicitly casting "Test" to a Rectangle */
        for(Rectangle r: list) {
            System.err.println(r);
        }
    }
}
1 голос
/ 16 октября 2008

Дано:

  List<Node> nodelist = new ArrayList<Node>();
  Object toAdd = new Object();

тогда:

  ((List) nodelist).add(toAdd);

или

  ((List<Object>) nodelist).add(toAdd);

сделает хак. Ик. Я чувствую себя грязным Но вы не должны этого делать. Если вам действительно нужно смешивать типы, сделайте следующее:

  List<Object> mixedList = new ArrayList<Object>(list);
  mixedList.add(toAdd);

Это решение, по крайней мере, укажет другим, что они должны остерегаться того, что любой подкласс Object может быть в списке.

0 голосов
/ 16 октября 2008

Предполагая, что вы используете Generic для создания ArrayList, вы можете добавить в него не-Node, используя отражение, потому что во время выполнения информация о типе не сохраняется.

Зависит от того, как вы получаете объект из ArrayList, вы можете получить ClassCastException.

Если вам действительно нужен неспецифический тип в вашем ArrayList, то почему бы вам просто не использовать его без Generic?

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