Java泛型语法问题

时间:2013-07-21 08:35:46

标签: java generics

我正在尝试列出一个条目列表并且在如何执行此操作时遇到问题。不确定它是否可能,但我试图让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;
    }

}

}

2 个答案:

答案 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而不是迭代路径列表。