Java - 如何创建新的条目(键,值)?

我想创建一个类似于Util.Map.Entry的新项目,它将包含key, value的结构。

问题是,我不能实例化Map.Entry,因为它是一个接口。

有没有人知道如何为Map.Entry创建一个新的通用键/值对象?

有[public static class AbstractMap.SimpleEntry](http://java.sun.com/javase/6/docs/api/java/util/AbstractMap.SimpleEntry.html)。不要让名字中的 "抽象 "部分误导你:事实上,它不是一个 "抽象 "类(但它的顶层AbstractMap是)。

它是一个 "静态 "的嵌套类,这意味着你不需要一个包围的 "AbstractMap "实例来实例化它,所以像这样的东西编译起来很好。

Map.Entry entry =
    new AbstractMap.SimpleEntry("exmpleString", 42);

正如在另一个答案中指出的,Guava还有一个方便的静态工厂方法Maps.immutableEntry,你可以使用。


你说

我不能使用Map.Entry本身,因为显然它是一个只读对象,我不能实例化新的instanceof

这并不完全准确。你不能直接实例化它(即用new)的原因是它是一个[interface Map.Entry](http://java.sun.com/javase/6/docs/api/java/util/Map.Entry.html)。


注意事项和提示

正如文档中所指出的,AbstractMap.SimpleEntry'是@自1.6以来',所以如果你坚持使用5.0,那么它就对你无效了。

要寻找另一个`实现Map.Entry'的已知类,事实上你可以直接去看javadoc。来自Java 6版本

Interface Map.Entry

所有已知的实现类

不幸的是,1.5版本并没有列出任何你可以使用的已知实现类,所以你可能只能自己实现。

评论(7)
解决办法

你可以自己实现Map.Entry接口即可。

import java.util.Map;

final class MyEntry implements Map.Entry {
    private final K key;
    private V value;

    public MyEntry(K key, V value) {
        this.key = key;
        this.value = value;
    }

    @Override
    public K getKey() {
        return key;
    }

    @Override
    public V getValue() {
        return value;
    }

    @Override
    public V setValue(V value) {
        V old = this.value;
        this.value = value;
        return old;
    }
}

然后再使用它。

Map.Entry entry = new MyEntry("Hello", 123);
System.out.println(entry.getKey());
System.out.println(entry.getValue());
评论(5)

尝试Maps.immutableEntry from Guava

这样做的好处是与Java 5兼容(不像AbstractMap.SimpleEntry那样需要Java 6。)

评论(0)