Определение коллекций без определенного типа - PullRequest
0 голосов
/ 12 сентября 2011
    public static void main(String[] args) {
       Set vals = new TreeSet();
       vals.add("one");
       vals.add(1);
       vals.add("two");
       System.out.println(vals);
}

(i) -Что значит определить коллекцию без указания ее типа? Для каких целей она предназначена?

(ii) -Можно добавить другой тип в коллекциюВ любом случае?

Вот пример - ошибки компиляции нет, хотя она предупреждает меня.

Но, как исключение, есть ошибка времени выполнения.

Ответы [ 4 ]

2 голосов
/ 12 сентября 2011
  1. Определение коллекции (или любого типизированного класса) без указания аргумента типа вызывается с использованием необработанного типа.Он существует только для обратной совместимости и не должен использоваться в новом коде.Если эффективно удалить все эффекты универсальных типов для типа.
  2. Как правило, вы можете определить свой набор для принятия Object: тогда он будет принимать все значения: Set<Object> vals = new HashSet<Object>(). Однако это не сработает для TreeSet, потому что ему нужно, чтобы его значения были Comparable друг с другом. Если вы хотите добавить произвольные типы к одному и тому же TreeSet (что обычно является признаком некоторых архитектурных проблем, например запаха дизайна), то вам нужно будет реализовать свой собственный Comparator, который может сравнивать произвольные элементы и передавать их в соответствующий TreeSet конструктор .
1 голос
/ 12 сентября 2011
private Set<JPanel> s1;

public void run() {
    aMethod(s1);
}

/* line 7 */ public void aMethod(Set panels) {

}

Если вы выполните рефакторинг вышеуказанного кода, изменив 7-ю строку на

public void aMethod(Set<Object> panels) {

, он больше не будет компилироваться.Если вы реорганизуете эту строку в

public void aMethod(Set<?> panels) {

, она все равно будет скомпилирована, как и раньше, и в качестве дополнительного бонуса у вас больше не будет предупреждения «Set is raw ...»

1 голос
/ 12 сентября 2011

До Java 1.4 не было никаких обобщений. Все коллекции могут содержать только Object, и вам придется классифицировать объект при использовании объекта после удаления его из коллекции. Так вы бы сделали

Set vals = new Treeset();
String s = (String)vals.get(0);

вместо

Set<String> vals = new Treeset<String>();
String s = vals.get(0);

Размещение различных типов объектов, которые не имеют общего интерфейса или суперкласса, является очень плохой практикой, поскольку вы не знаете, как обрабатывать объект, когда вынимаете его из коллекции.

1 голос
/ 12 сентября 2011

i) Это означает, что может иметь любой объект. Если вы хотите добавить любой тип. (Вообще проблема дизайна)

ii) Используя стирание типа, вы можете.

Но, как исключено, есть ошибка времени выполнения.

Получение ошибки во время компиляции обычно лучше, чем получение ошибки времени выполнения. (Легче найти и исправить)

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