-3

我正在尝试列出条目,但在执行此操作时遇到了麻烦。不确定是否有可能,但我试图让 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;
    }

}

}

4

2 回答 2

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> {
        . . .
    }
}
于 2013-07-21T08:40:55.023 回答
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);

顺便说一句,也许您应该使用 aMap而不是在路径列表上进行迭代。

于 2013-07-21T08:57:51.217 回答