Java 如何使用番石榴';s ClassToInstanceMap<;B>;?

Java 如何使用番石榴';s ClassToInstanceMap<;B>;?,java,guava,Java,Guava,我尝试使用番石榴的ClassToInstanceMap 我想让我的客户使用一个方法addMyObject(MyObject),因此我尝试编写以下方法: private final ClassToInstanceMap<MyObject> instances = MutableClassToInstanceMap.create(); public void addMyObject1(MyObject o) { instances.putInstance(o.getClass(

我尝试使用番石榴的
ClassToInstanceMap

我想让我的客户使用一个方法
addMyObject(MyObject)
,因此我尝试编写以下方法:

private final ClassToInstanceMap<MyObject> instances = MutableClassToInstanceMap.create();

public void addMyObject1(MyObject o) {
    instances.putInstance(o.getClass(), o);
}

public <O extends MyObject> void addMyObject2(O o) {
    instances.putInstance(o.getClass(), o);
}
private final ClassToInstanceMap实例=MutableClassToInstanceMap.create();
公共无效添加MyObject 1(MyObject o){
instances.putInstance(o.getClass(),o);
}
公共无效添加对象2(O){
instances.putInstance(o.getClass(),o);
}
但很自然,这两种方法都无法编译


那么,如何正确地使用它呢?

既然您确信
o
MyObject
的一个实例,那么就不需要使用类型安全
putInstance
方法。您可以使用标准的
put()

private final ClassToInstanceMap实例=MutableClassToInstanceMap.create();
公共无效添加MyObject(MyObject o){
put(o.getClass(),o);
}
ClassToInstanceMap
无论如何都会对实例的类型进行运行时检查


也就是说,我对使用类型安全方法实现这一点感兴趣。也许有一些Java泛型的魔力:)

为了记录在案,您可以使用

o.getClass().asSubclass(MyObject.class)

这确实是一个有趣的路径,但不幸的是,它没有编译好,因为
asSubclass
不返回
Class
,而是返回
o.getClass().asSubclass(MyObject.class)