2013-07-26 2 views
-2

Ниже приведена программа, которую я написал для того, чтобы понять программирование генериков в Java. Как вы, наверное, заметили, что я новичок в java, и не удивительно, что эта программа не компилируется.сначала попытайтесь понять java generics

import java.util.*; 

public class GenericBox<T> 
{ 

    private List<T> t; 
    private Iterator<T> itor; 

    public GenericBox() 
    { 
      t = new ArrayList<T>(); 
      itor = t.listIterator(); 
    } 

    public void insert(T t) 
    { 
      itor.add(t); 
    } 

    public T retrieve() 
    { 
      if(itor.hasNext()) 
      { 
        return itor.next(); 
      } 

    } 

    public static void main (String [] args) 
    { 

      GenericBox <String> strbox = new GenericBox<String>(); 
      GenericBox <String> intbox = new GenericBox<String>(); 

      strbox.insert(new String("karthik")); 
      strbox.insert(new String("kanchana")); 
      strbox.insert(new String("aditya")); 


      String s = strbox.retrieve(); 
      System.out.println(s); 

      s = strbox.retrieve(); 
      System.out.println(s); 

      s = strbox.retrieve(); 
      System.out.println(s); 
    } 
} 

Ниже приводятся ошибки компиляции, которые я получаю.

GenericBox.java:17: error: cannot find symbol 
     itor.add(t);  
      ^
    symbol: method add(T) 
    location: variable itor of type Iterator<T> 
    where T is a type-variable: 
    T extends Object declared in class GenericBox 
1 error 

Может кто-нибудь указать, что конкретно представляет собой проблема здесь.

+1

Этот вопрос не соответствует теме, потому что речь идет о запросе на исправление. – hexafraction

+3

Я не думаю, что это опечатка, но отсутствие понимания наследования и полиморфизма. –

ответ

5

Ваша ошибка не в генериках. Они работоспособны. Ваша ошибка:

itor.add(t); 

Вы не добавляете объекты в итератор.

Вы добавляете их в список. Итератор может только перечислить и перебрать их. Используйте

this.t.add(t); 

Я бы переименовать список tList и изменить код:

private List<T> tList; 
private Iterator<T> itor; 

public GenericBox() 
{ 
     t = new ArrayList<T>(); 
     itor = tList.listIterator(); 
} 
public void insert(T t) 
{ 
     tList.add(t); 
} 

и так далее ...

2

Iterator<T> не имеет add<T>(T) метод. Вероятно, вы имели в виду this.t.add(t); вместо itor.add(t);.

3

Вы объявили объект itor типа Iterator<T> и инициализировали его объектом типа ListIterator<T>. Таким образом, с помощью ссылки itor вы можете получить доступ только к методам Iterator<T>. Если вы хотите получить доступ к add() методу ListIterator, то itor должен быть объявлен как ListIterator.