Я хотел бы создать новый объект это так же к Util.Map.Entry
это будет содержать структуру key
, value
.
Проблема состоит в том, что я не могу инстанцировать a Map.Entry
потому что это - интерфейс.
Делает любой знает, как создать новый универсальный объект ключа/значения для Карты. Запись?
Вы можете просто реализовать интерфейс Map.Entry
самостоятельно:
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 из Guava
Это имеет то преимущество, что он совместим с Java 5 (в отличие от AbstractMap.SimpleEntry
, который требует Java 6.)
Я определил общий класс Pair, который использую все время. Это великолепно. В качестве бонуса, определяя статический фабричный метод (Pair.create), мне нужно писать аргументы типа только вдвое реже.
public class Pair<A, B> {
private A component1;
private B component2;
public Pair() {
super();
}
public Pair(A component1, B component2) {
this.component1 = component1;
this.component2 = component2;
}
public A fst() {
return component1;
}
public void setComponent1(A component1) {
this.component1 = component1;
}
public B snd() {
return component2;
}
public void setComponent2(B component2) {
this.component2 = component2;
}
@Override
public String toString() {
return "<" + component1 + "," + component2 + ">";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((component1 == null) ? 0 : component1.hashCode());
result = prime * result
+ ((component2 == null) ? 0 : component2.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Pair<?, ?> other = (Pair<?, ?>) obj;
if (component1 == null) {
if (other.component1 != null)
return false;
} else if (!component1.equals(other.component1))
return false;
if (component2 == null) {
if (other.component2 != null)
return false;
} else if (!component2.equals(other.component2))
return false;
return true;
}
public static <A, B> Pair<A, B> create(A component1, B component2) {
return new Pair<A, B>(component1, component2);
}
}
Есть public static class AbstractMap.SimpleEntry
. Пусть часть имени Abstract
не вводит вас в заблуждение: на самом деле это НЕ класс abstract
(но его верхний уровень AbstractMap
является таковым).
Тот факт, что это статический
вложенный класс, означает, что вам НЕ нужен вложенный AbstractMap
экземпляр, чтобы инстанцировать его, поэтому что-то вроде этого компилируется нормально:
Map.Entry<String,Integer> entry =
new AbstractMap.SimpleEntry<String, Integer>("exmpleString", 42);
Как было отмечено в другом ответе, Guava также имеет удобный статический
фабричный метод Maps. immutableEntry
который вы можете использовать.
Вы сказали:
Я не могу использовать
Map.Entry
сам по себе, потому что, очевидно, это объект только для чтения, который я не могу инстанцировать newinstanceof
Это не совсем точно. Причина, по которой вы не можете создать его напрямую (т.е. с помощью new
), заключается в том, что это интерфейс Map.Entry
.
Как отмечено в документации, AbstractMap.SimpleEntry
является @since 1.6
, так что если вы застряли на 5.0, то он вам недоступен.
Чтобы найти другой известный класс, который реализует Map.Entry
, вы можете обратиться непосредственно к javadoc. Из версии Java 6
Interface Map.Entry
All Known Implementing Classes:
К сожалению, в версии 1.5 нет списка известных реализующих классов, которые вы можете использовать, так что вы можете застрять с реализацией своего собственного.