最终,我创建了自己的TypedMultimap,使用了tobias_k的提示
comment。
我创建了这个类:
import com.google.common.collect.ForwardingMultimap;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import java.util.Collection;
public class TypedMultimap extends ForwardingMultimap<Class, Object> {
private final HashMultimap<Class, Object> delegate;
public TypedMultimap() {
this.delegate = HashMultimap.create();
}
public <T> Collection<T> getSafely(Class<T> key) {
return (Collection<T>) delegate().get(key);
}
public <T> boolean putSafely(
Class<T> key, T value) {
return delegate.put(key, value);
}
public <T> boolean putSafely(T value) {
return delegate.put(value.getClass(), value);
}
@Override
public Collection<Object> get(Class key) {
return getSafely(key);
}
@Override
public boolean put(Class key, Object value) {
return putSafely(key, value);
}
@Override
protected Multimap<Class, Object> delegate() {
return delegate;
}
}
编辑:现在您可以使用(new SomeClass());将其放入映射中,在SomeClass.class下进行映射。这样,您只需添加数据而不必关心类别,映射将为您进行排序。然后,您可以使用<T> Collection<T> getSafely(Class<T> key)获取特定类型的所有实例。
现在当您调用getSafely或putSafely时,它会为您检查类型。缺点是,用户需要知道他应该使用单个参数put方法添加数据。此外,只有getSafely和putSafely会检查编译时错误。
现在您可以这样做:
TypedMultimap typedMultimap = new TypedMultimap();
typedMultimap.putSafely(new ExportThing("prvý"));
typedMultimap.putSafely(new ExportThing("druhý"));
typedMultimap.putSafely(ExportThing.class, new ExportThing("prvý"));
typedMultimap.putSafely(new ExportPhoneNumber("prvý"));
typedMultimap.putSafely(ExportPhoneNumber.class, new ExportPhoneNumber("druhý"));
Collection<ExportPhoneNumber> safely = typedMultimap.getSafely(ExportPhoneNumber.class);
for (ExportPhoneNumber safely1 : safely) {
System.out.println(safely1.getPhoneNumber());
}
将返回:
druhý
prvý
正在尝试做
typedMultimap.putSafely(ExportThing.class, new ExportPhoneNumber("prvý"))
会导致编译时错误。
这是一个有点问题的Map>。如果你需要Map>,例如代替HashMultimap使用ArrayListMultimap作为委托。
{Person.class: [Person1, Person2], Profile.class: [Profile1, Profile2], ...}
- tobias_k<T> List<T> get(Class<T> key)
的方法。 - tobias_k