Связывание экземпляров без класса arg в Guice - PullRequest
0 голосов
/ 14 января 2019

Почему это не работает в Guice?

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

Я не совсем понимаю, в каком случае дженериков это нарушается, мне это кажется правильным. Сообщение об ошибке в IntelliJ:

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

1007 *

1 Ответ

0 голосов
/ 14 января 2019

Компилятор не знает, что instance.getClass() связано с instance.

Скажите, instance - это Number: instance.getClass() - это Class<? extends Number>, потому что instance может быть Integer.

И тогда алгоритм вывода типов не знает, что instance является экземпляром этого Class<? extends Number>. По мнемонике PECS , toInstance является потребительским методом, но поскольку он ограничен границей extends, единственное, что вы можете передать ему, это буквально null.

Я не могу придумать чистый способ сделать это без некоторого предупреждения подавления. Но в этом случае хорошо подавлять (при условии, что instance является экземпляром класса reifiable): вы знаете больше, чем компилятор о типах, так что продолжайте и используйте escape-люк.

...