Нетипизированные универсальные классы Java, удаление их функций универсальных типов - PullRequest
2 голосов
/ 14 декабря 2010

ОК. Вопрос о дженериках javas, повторяемости и цикле for-each. Проблема в том, что, если я объявлю свой класс «Test» нетипизированным, я потеряю всю общую информацию обо всех моих функциях, и for-each это совсем не нравится.

Пример

public class Test<T> implements Iterable<Integer>{

    public Test() {}

    public Iterator<Integer> iterator() {return null;}

    public static void main(String[] args) {
        Test t = new Test();

        //Good,
        //its returning an Iterator<object> but it automatically changes to  Iterator<Integer>
        Iterator<Integer> it = t.iterator();

        //Bad
        //incompatable types, required Integer, found Object
        for(Integer i : t){
        }
    }Untyped generic classes losing 
}

Когда «Test t» нетипизирован, функция «iterator ()» возвращает «iterator» вместо «iterator ».

Я не совсем уверен, по какой причине, я знаю, что исправить это просто использовать подстановочный знак в «Тесте <? > t = новый тест () '. Однако это далеко не идеальное решение.
Есть ли у них какой-либо способ редактировать только объявление класса и его функции и иметь нетипизированную для каждого цикла работу?

Ответы [ 2 ]

3 голосов
/ 14 декабря 2010

Вы должны просто сделать следующее:

public class Test implements Iterable<Integer>{

Удалить общий тип все вместе.

Ваш класс Test не является универсальным вообще.Это просто реализация универсального интерфейса.Объявление универсального типа не обязательно.Это также поможет удалить то общее предупреждение, которое вы получили.

@ Eugene дает хорошее замечание.Если вам действительно нужен универсальный тип Test, вы должны объявить Test в качестве универсального итератора:

Вы должны просто сделать следующее:

public class Test implements Iterable<Integer>{

Удалить универсальный тип все вместе.

Ваш класс Test не является универсальным.Это просто реализация универсального интерфейса.Объявление универсального типа не обязательно.Это также поможет удалить то общее предупреждение, которое вы получали.

public class Test<T> implements Iterable<T>{

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

Test<Integer> t = new Test<Integer>;

Тогдавызовы на for(Integer i: t) будут компилироваться.

2 голосов
/ 15 декабря 2010

Вы должны написать это:

public class Test implements Iterable<Integer>{
  ...

или фактически обобщить свой класс:

public class Test<T> implements Iterable<T> {

    public Iterator<T> iterator() {return null;}

    public static void main(String[] args) {
        Test<Integer> t = new Test<Integer>();

        Iterator<Integer> it = t.iterator();

        for(Integer i : t){
        }
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...