我想创建一个类似于Util.Map.Entry
的新项目,它将包含key
, value
的结构。
问题是,我不能实例化Map.Entry
,因为它是一个接口。
有没有人知道如何为Map.Entry创建一个新的通用键/值对象?
有[public static class AbstractMap.SimpleEntry<K,V>
](http://java.sun.com/javase/6/docs/api/java/util/AbstractMap.SimpleEntry.html)。不要让名字中的 "抽象 "部分误导你:事实上,它不是一个 "抽象 "类(但它的顶层AbstractMap
是)。
它是一个 "静态 "的嵌套类,这意味着你不需要一个包围的 "AbstractMap "实例来实例化它,所以像这样的东西编译起来很好。
Map.Entry<String,Integer> entry =
new AbstractMap.SimpleEntry<String, Integer>("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<K,V>
所有已知的实现类。
不幸的是,1.5版本并没有列出任何你可以使用的已知实现类,所以你可能只能自己实现。
你可以自己实现Map.Entry<K, V>
接口即可。
import java.util.Map;
final class MyEntry<K, V> implements Map.Entry<K, V> {
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<String, Object> entry = new MyEntry<String, Object>("Hello", 123);
System.out.println(entry.getKey());
System.out.println(entry.getValue());
尝试Maps.immutableEntry from Guava
这样做的好处是与Java 5兼容(不像AbstractMap.SimpleEntry
那样需要Java 6。)