2013-07-21 92 views
-2

我正在嘗試列出Entry並在如何執行此操作時遇到問題。不知道它是否可能,但我試圖讓Example對象返回它找到的條目的V.我不希望它只返回一個「對象」。是的,它爲get()方法提供了編譯錯誤,但是如何修復它以便它可以工作?謝謝。 每個條目可能有不同的類型。Java泛型語法的問題

public class Example { 

private List<Entry<?>> data = new ArrayList<Entry<?>>(); 

public Example() { 

} 

public V get(String path) { 
    for (Entry<?> entry : data) { 
     if (entry.getPath().equals(path)) { 
      return entry.getValue(); 
     } 
    } 
    return null; 
} 

private static class Entry<V> { 

    private String path; 
    private V value; 

    public Entry() { 

    } 

    public Entry(String path, V value) { 
     this.path = path; 
     this.value = value; 
    } 

    public void setPath(String path) { 
     this.path = path; 
    } 

    public void setValue(V value) { 
     this.value = value; 
    } 

    private String getPath() { 
     return path; 
    } 

    private V getValue() { 
     return value; 
    } 

} 

}

+0

請向我們展示您的編譯錯誤。 – tbodt

+0

錯誤是'public V get(String path)'當然,但我的問題是如何讓它識別V? – CBennett

+0

如果你做'私人列表> data = new ArrayList >();'那樣? – Elbek

回答

2

您可能不想讓Example通用的,但是這就是你需要做的,因爲你要存儲的通用Entry對象,並有get(String)返回一個通用對象:

public class Example<T> { 

    private List<Entry<T>> data = new ArrayList<Entry<T>>(); 

    public Example() { 

    } 

    public T get(String path) { 
     for (Entry<T> entry : data) { 
      if (entry.getPath().equals(path)) { 
       return entry.getValue(); 
      } 
     } 
     return null; 
    } 

    private static class Entry<V> { 
     . . . 
    } 
} 
+0

所以我不能列出不同的可能的V?並讓它恢復原來的樣子。 – CBennett

+0

@CBennett - 由於'Example'的實例必須存儲'Entry'對象的列表,並且'Entry'是通用的,所以您會遇到困難。另一種方法是使Entry不是通用的,而是存儲Object對象的值。然後您會放棄泛型提供的所有編譯時類型檢查。也許你可以更詳細地解釋你想要完成的事情,並且我們可以提出另一種方法。 –

+0

我的目標是將示例類作爲多個條目的持有者列表,可能是條目,條目或其他任何內容,全部不一樣。然後讓示例方法get()返回條目值的Type。就像它的一個條目它返回一個字符串,等等。 – CBennett

0

如果您在致電get(String)時知道V的類型,則可以添加Class參數以將Entry<?>的內容轉換爲所需的類型:

public <V> V get(String path, Class<V> clazz) { 
    for (Entry<?> entry : data) { 
     if (entry.getPath().equals(path) && clazz.isInstance(entry.getValue())) { 
      return clazz.cast(entry.getValue()); 
     } 
    } 
    return null; 
} 

這裏是如何使用它:

example.add(new Entry<String>("color", "blue")); 
example.add(new Entry<String>("model", "Some Model")); 
example.add(new Entry<Integer>("numberOfTires", 4)); 

Integer tires = example.get("age", Integer.class); 
String model = example.get("model", String.class); 

順便提一句,也許你應該使用Map代替迭代路徑的名單上。

+0

謝謝你的作品!不知道你可以添加泛型類型的方法,很好。 – CBennett