Дженерики не работают для типа возврата - PullRequest
3 голосов
/ 28 июня 2010

Почему java не допускает следующий универсальный тип возврата:

public <T extends Enum<T> & MyInterface> Class<T> getEnum() {
    return MyEnum.class;
}

Пока работает следующее:

public <T extends Enum<T> & MyInterface> Class<T> getEnum(Class<T> t) {
    return t;
}

getEnum(MyEnum.class); 

MyEnum - это перечисление, которое реализует интерфейсMyInterface.

Почему я не могу вернуться MyEnum.class?

РЕДАКТИРОВАТЬ:

Мне это нужно, потому что функция getEnum() в интерфейсе.Его можно определить следующим образом:

@Override
public Class<MyEnum> getEnum() {
    return MyEnum.class;
}

Но что тогда будет типом возвращаемого значения метода интерфейса, чтобы разрешить любому Class объекту класса, который является как перечислением, так и реализует MyInterface?

Ответы [ 2 ]

7 голосов
/ 28 июня 2010

Ваш метод параметризован как T - идея состоит в том, что вызывающая сторона получает возможность указать, что такое T, а не реализация метода.

Вызов второго метода работает, потому что T неявно указывается (вызывающим) как MyEnum.

2 голосов
/ 28 июня 2010

Я нашел ответ и на второй вопрос:

Интерфейс с универсальным типом должен быть параметризован:

public interface MyEnumReturner <T extends Enum<T> & MyInterface>
{
    public Class<T> getEnum(Class<T> t);
}

Затем класс, реализующий интерфейс, определяет, какой тип использовать:

public class MyClass implments MyEnumReturner<MyEnum>
{
    @Override
    public Class<MyEnum> getEnum() {
        return MyEnum.class;
    }

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