Generi c объект с рисунком строителя - PullRequest
0 голосов
/ 26 января 2020

У меня есть поле Producer<?, ?> producer в моем классе, реализация которого зависит от заданного состояния, используя шаблон построителя, например:

private void changeImplementation(int state) {
    switch (state) {
        case 0:
            producer = builder
                           .setKey(Long.class)
                           .setValue(String.class)
                           .setOtherStuff(...)
                           .build() // return the object with correct key and value
        break;
        case 1:
            ...
}

Но всякий раз, когда я вызываю метод для производителя (например, с типы Producer<Long, String>), эта ошибка выдается (Eclipse EE):

The method method(Record<capture#9-of ?,capture#10-of ?>) in the type Producer<capture#9-of ?,capture#10-of ?> is not applicable for the arguments (Record<Long,String>)

Создание преобразования до build() или внутри вызова метода не помогло. Шаблон сборки отлично работает в других местах проекта.

1 Ответ

1 голос
/ 26 января 2020

Проблема связана не с шаблоном компоновщика, а с тем, что тип вашего поля producer вызывается с неизвестным типом ?. По этой причине вы можете назначать значения только аргументам обобщенных c типов Producer, которые являются подтипами неизвестного типа. Однако, единственным значением, тип которого является подтипом ?, является null, поэтому оно действительно ограничивает то, что вы можете сделать с вашим Producer<?,?>.

Чтобы обойти это, вы должны либо связать свое обобщение c Разные виды дизайна вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...