我正在尝试列出一个条目列表并且在如何执行此操作时遇到问题。不确定它是否可能,但我试图让Example对象返回它找到的条目的V.我不希望它只返回一个'对象'。是的,它为get()方法提供了编译错误,但我如何修复它以便它工作?谢谢。 每个条目可能有不同的类型。
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 :(得分: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> {
. . .
}
}
答案 1 :(得分:0)
如果您在调用V
时知道get(String)
的类型,那么您可以添加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
而不是迭代路径列表。