首先尝试理解java泛型

时间:2013-07-26 22:19:29

标签: java

下面是我编写的一个程序,用于理解Java中的泛型编程。 你可能已经注意到我是java的新手并不奇怪这个程序不能编译。

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

有人可以在这里指出究竟是什么问题。

3 个答案:

答案 0 :(得分: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);
}

依旧......

答案 1 :(得分:3)

您已声明类型为itor的对象Iterator<T>,并使用ListIterator<T>类型的对象对其进行初始化。因此,通过引用itor,您只能访问Iterator<T>的方法。如果您要访问add()的{​​{1}}方法,则必须将ListIterator声明为itor

答案 2 :(得分:2)

Iterator<T>没有add<T>(T)方法。您可能打算拨打this.t.add(t);而不是itor.add(t);