需要帮助理解java泛型概念

时间:2014-09-18 20:38:00

标签: java

我试图在下面的代码中找到这个错误,我故意只是为了深入探索概念。

import java.util.ArrayList;
import java.util.Iterator;

class typeAnimal<String> implements Iterable<String>  //// (1)
{
    ArrayList<String> listAnimal = new ArrayList<String>();
    typeAnimal(ArrayList<String> listAnimal)
    {
        this.listAnimal = listAnimal;
    }

    @Override
    public Iterator<String> iterator()
    {
        return new Iterator<String>()
        {
            int position;

            @Override
            public boolean hasNext() {
                if(position<listAnimal.size())
                    return true;
                else
                    return false;
            }

            @Override
            public String next() 
            {
                String aniPos = listAnimal.get(position);
                position ++;
                return aniPos;
            }

            @Override
            public void remove() {
                // TODO Auto-generated method stub
            }
        };
    }
}

public class newIterator
{
    public static void main(String[] args)
    {
        ArrayList<String> animalList = new ArrayList<String>();
        animalList.add("priyank");
        animalList.add("kannu");

        typeAnimal<Object> animalName= new typeAnimal(animalList);

        for(String name:animalName)     //// <-- Error
        {
            System.out.println(name);
        }
    }
}

错误为Type mismatch: cannot convert from element type Object to String。但是,如果我将(1)中的typeAnimal<String>替换为typeAnimal<Object>,则错误将消失。 我知道这是值得的代码,但仍然想知道究竟是什么导致错误。

1 个答案:

答案 0 :(得分:1)

class typeAnimal<String> implements Iterable<String>

当类具有泛型参数时,通常称为T或其他单个字母名称。这清楚地表明该类的实际实例必须用真实类替换该参数。

当你调用你的类型参数String时,你会混淆编译器,因为Java中已经有一个String类。

您应该定义一个非泛型类:

class typeAnimal implements Iterable<String>

或通用类:

class typeAnimal<T> implements Iterable<T>

前者意味着您的类在Iterable类上实现了String。 后者意味着您的类在泛型类型参数上实现Iterable