Guice 中不带 class arg 的绑定实例

Binding instances without class arg in Guice

为什么这在 Guice 中不起作用?

binder().bind(instance.getClass()).toInstance(instance);

我不太明白这违反了哪种泛型边缘情况,这对我来说看起来很合理。 IntelliJ 中的错误信息是:

toInstance (capture<? extends java.lang.Object>) in LinkedBindingBuilder cannot be applied to (java.lang.Object)

编译器不知道 instance.getClass()instance 相关。

instanceNumberinstance.getClass()Class<? extends Number>,因为 instance 可能是 Integer.

然后类型推断算法不知道 instanceClass<? extends Number> 的一个实例。根据 PECS mnemonictoInstance 是一个消费者方法,但因为它受 extends 限制的限制,所以您唯一可以传递给它的是文字 null.

我想不出一个干净的方法来做到这一点,没有一些警告抑制。但在这种情况下,可以抑制(假设 instance 是可具体化 class 的一个实例):你比编译器更了解类型,所以继续使用逃生舱口。