2015-05-14 61 views
0

我想使我自己的類型ArrayList存儲一些值。但是,我收到一個錯誤「x無法解析或不是字段」,例如源代碼。ArrayList錯誤

這裏是我的代碼片段:

public class myClass { 

public static void main(String args[]){ 
    addEdge("a","b", 10); 
} 

private static void addEdge(String source, String destination, int cost) { 
     List<Edge> add = new ArrayList<Edge>(); 
     add.source = source; //error: source cannot be resolved or is not a field 
     add.destination = destination; //error: destination cannot be resolved or is not a field 
     add.cost = cost; //error: cost cannot be resolved or is not a field 
} 
} 

class Edge{ 
    String source; 
    String destination; 
    int cost; 
} 

正如你可以看到我在addEdge方法出現錯誤。我

+0

'add'是一個'List'。一個列表沒有「來源,目的地,成本等等」字段,您需要首先使用List.get(index)來訪問列表中的項*,以便能夠編輯這些字段。 – GiantTree

+0

@Sabir,答案是正確的,無論如何,我不會使用「添加」作爲變量名稱,因爲它已經是List類的一種方法,所以它可能會被混淆。 – Drumnbass

回答

3

在你的代碼

List<Edge> add = ... 
add.source = ... 

你試圖通過add參考這是List類型的訪問source字段,但List沒有source字段(這是什麼錯誤消息試圖說)。您需要從Edge訪問此字段,而不是List

因此,嘗試更多的東西一樣

Edge edgeInstance = new Edge(); 
edgeInstance.source = source; 
edgeInstance.destination = destination; 
edgeInstance.cost = cost; 
... 

listOfEdges.add(edgeInstance); 

反正你應該避免讓你的領域從你的類的外部訪問。它們應該是私有的,你應該通過構造函數或setter來初始化它們。

而且似乎每次你在呼喚你的方法時,你正在創造新的列表

List<Edge> add = new ArrayList<Edge>(); 

,你是不是在任何地方重新使用這種方法,這似乎一種毫無意義之外。

+0

我明白了。謝謝。 – nTuply

+0

我很高興,歡迎你:) – Pshemo

1

假設ListArrayList類型你在addEdge方法引用是Java自身java.util.List等,他們沒有訪問的屬性命名爲sourcedestinationcost

如果ArrayList是你自己的實現,它並沒有配備sourcedestinationcost領域。

你想在這裏使用的習慣用法是引用一個Edge實例並改變它的字段。

要做到這一點,你會怎麼做:

add.get(x).setSource("some source"); 

這意味着:

  • Listnull也不空
  • x是有效的索引
  • Edge元素在索引x不是null
  • 您實現制定者/吸氣你Edge領域
1

通過定義類型邊界列表,您不會在邊界內定義字段。這是一個列表,您可以在其中添加/刪除/迭代元素。

就你而言,List只能添加Edge類型的對象。所以你需要創建Edgle:

List<Edge> add = new ArrayList<Edge>(); 
Edge edge = new Edge(source, destination, cost);//add constructor to your edge class like public Edge(Source source...){ this.source = source;.. } 
add.add(edge);//rename list to meaningful name like edgeList