2014-09-18 83 views
-5

我想找到以下代碼中的錯誤,我故意擰的只是深入探索概念。需要幫助瞭解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。但是,如果我在更換typeAnimal<String>(1)typeAnimal<Object>錯誤就會消失。 我知道這是值得的代碼,但仍然想知道究竟是什麼導致錯誤。

回答

1

class typeAnimal<String> implements Iterable<String>

當一個類有一個通用的參數,它通常被稱爲T或其他單字母域名。這就清楚地表明,該類的實際實例必須用真實的類來替換該參數。

當您調用類型參數String時,由於Java中已有String類,因此您會混淆編譯器。

您應該定義一個非通用類:

class typeAnimal implements Iterable<String>

或通用類:

class typeAnimal<T> implements Iterable<T>

,你的類實現一個IterableString類,前者手段。 後者意味着您的類在泛型類型參數上實現了Iterable

+0

謝謝艾蘭,但我仍然不清楚拋出的錯誤。爲什麼呢,如果我將(1)中的typeAnimal 替換爲typeAnimal ,Error將消失。這裏的錯誤是「類型不匹配:不能從元素類型對象轉換爲字符串」。我無法理解究竟是什麼導致了這個錯誤。 – priyank 2014-09-19 05:01:40