我试图在下面的代码中找到这个错误,我故意只是为了深入探索概念。
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>
,则错误将消失。
我知道这是值得的代码,但仍然想知道究竟是什么导致错误。
答案 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
。