Как я могу указать неограниченный параметр типа шаблона? - PullRequest
1 голос
/ 26 июня 2019

Мне не удалось выбрать правильные слова для вопроса.

У меня есть класс и метод фабрики.

class MyObject<Some, Other> {

    static <T extends MyObject<U, V>, U, V> T of(
            Class<? extends T> clazz, U some, V other) {
        // irrelevant 
    }

    private Some some;

    private Other other;
}

Теперь я хочу добавить еще два метода фабрики, каждый из которыхтолько занимает U или V.

Это будет выглядеть так.Это означает, что пропущенные V или U остаются неустановленными (null).

static <T extends MyObject<U, ?>, U> T ofSome(
        Class<? extends T> clazz, U some) {
    // TODO invoke of(clazz, some, @@?);
}

static <T extends MyObject<?, V>, V> T ofOther(
        Class<? extends T> clazz, V other) {
    // TODO invoke of(clazz, @@?, other);
}

Я пробовал это, но не удалось.

static <T extends MyObject<U, ?>, U> T ofSome(
        final Class<? extends T> clazz, final U some) {
    return of(clazz, some, null);
}

Компилятор жалуется со следующим сообщением.

Не найдено подходящего метода для of (java.lang.Class, U, )

Как правильно это сделать?

1 Ответ

2 голосов
/ 26 июня 2019

Вам все еще нужен универсальный параметр V, вам просто не нужен параметр метода V.

static <T extends MyObject<U, V>, U, V> T ofSome(
        final Class<? extends T> clazz, final U some) {
    return of(clazz, some, null);
}

Вам нужно V в ofSome, чтобы компилятор мог определить тип V для of, посмотрев на тип clazz.

...