Как использовать пользовательский класс в качестве переменной типа для Итератора? - PullRequest
0 голосов
/ 15 февраля 2011

У меня есть следующий код, использующий дженерики:

Set membersKeySet = membersList.keySet();
Iterator<DoubleKey> membersItr = membersKeySet.iterator();
while(membersItr.hasNext()){
    DoubleKey<Integer, Integer> dk =  membersItr.next();
}

Eclipse говорит мне, что «Set является необработанным типом. Ссылки на универсальный тип должны быть параметризованы».DoubleKey также является универсальным классом.Я понимаю, что метод .iterator () не гарантирует, что класс DoubleKey был передан с теми же типами параметров.Я пробовал типизацию, но это не работает.Как я могу это осуществить?Спасибо!

PS Я все еще n00b использую Generics.

Ответы [ 5 ]

4 голосов
/ 15 февраля 2011

Если объекты, хранящиеся в наборе, являются экземплярами DoubleKey<Integer, Integer>, то код должен выглядеть так:

Set<DoubleKey<Integer, Integer>> membersKeySet = membersList.keySet();
Iterator<DoubleKey<Integer, Integer>> membersItr = membersKeySet.iterator();
while(membersItr.hasNext()){
    DoubleKey<Integer, Integer> dk =  membersItr.next();
}
0 голосов
/ 16 февраля 2011

Обычно вы используете компактную нотацию for-loop:

while(DoubleKey<Integer, Integer> dk: membersList.keySet()) {
}

И если вы используете DoubleKey&lt;Integer, Integer&gt; повсеместно, подумайте о том, чтобы сделать его классом самостоятельно:

class IIKey extends DoubleKey<Integer, Integer> {}
0 голосов
/ 15 февраля 2011

Из кода, который вы даете, похоже, что membersList на самом деле является картой какого-то рода. Таким образом, чтобы обеспечить безопасность обобщенных типов времени компиляции, необходимо правильно определить membersList, например,

Map<DoubleKey, Object> membersList = new HashMap<DoubleKey, Object>();
Set<DoubleKey> membersKeySet = membersList.keySet();

При этом ваш итератор должен работать так, как он у вас есть.

0 голосов
/ 15 февраля 2011

Ну, в зависимости от того, что membersList, я бы ожидал, что это будет решение:

Set<DoubleKey> membersKeySet = membersList.keySet();

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

0 голосов
/ 15 февраля 2011

Вы должны определить тип набора ключей.

Set<DoubleKey> membersKeySet = membersList.keySet();

Не могли бы вы предоставить memberList определение, чтобы предоставить полную картину?

...