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
相关。
说 instance
是 Number
:instance.getClass()
是 Class<? extends Number>
,因为 instance
可能是 Integer
.
然后类型推断算法不知道 instance
是 Class<? extends Number>
的一个实例。根据 PECS mnemonic,toInstance
是一个消费者方法,但因为它受 extends
限制的限制,所以您唯一可以传递给它的是文字 null
.
我想不出一个干净的方法来做到这一点,没有一些警告抑制。但在这种情况下,可以抑制(假设 instance
是可具体化 class 的一个实例):你比编译器更了解类型,所以继续使用逃生舱口。
为什么这在 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
相关。
说 instance
是 Number
:instance.getClass()
是 Class<? extends Number>
,因为 instance
可能是 Integer
.
然后类型推断算法不知道 instance
是 Class<? extends Number>
的一个实例。根据 PECS mnemonic,toInstance
是一个消费者方法,但因为它受 extends
限制的限制,所以您唯一可以传递给它的是文字 null
.
我想不出一个干净的方法来做到这一点,没有一些警告抑制。但在这种情况下,可以抑制(假设 instance
是可具体化 class 的一个实例):你比编译器更了解类型,所以继续使用逃生舱口。