2015-12-09 3 views
1

Я пытаюсь написать метод, в котором я могу преобразовать из строки в объект перечисления во время выполнения, для общего перечисления. У меня есть метод подписи:Непроверенная типизация родового класса?

public static <T extends Enum<T>> Enum<T> foo(String string, Class<T> clazz) 

Однако, я называю его из класса, чей общий тип параметра в явном виде не распространяется Enum. т.е.

class bar<X> { 
    private Class<X> clazz; 
    if (XIsAnEnum()) { 
    foo(string, clazz) 
    } 
} 

Это не компилируется, потому что даже если я знаю, из логики XIsAnEnum, этот X extends Enum<X>, я явно не указать это в родовом определении параметра типа, так что это не является веским аргументом.

Есть ли способ сделать неконтролируемый бросок от Class<X> к Class<X extends Enum<X>>, или я должен сделать новый класс bar2<X extends Enum<X>> специально для того, когда я хочу использовать перечислений?

+1

Я чувствую, что вам не хватает кода. То, что у вас есть, не будет компилироваться, потому что у вас нет этого оператора if в методе. – Troncoso

+0

Да, есть какой-то дополнительный код, который пойдет туда на самом деле, но это не влияет на вопрос. –

+0

Что содержат строки? Если это просто имя константы enum, вы можете сделать 'MyEnum.valueOf (string)', чтобы получить соответствующую константу MyEnum, и вам не нужно будет писать этот метод. – Jesper

ответ

0

Вы можете использовать Class#asSubclass(Class) сделать бросок для вас, как

foo("value", clazz.asSubclass(Enum.class)); 

Это предполагает фактическое подтверждение того, что clazz ссылается на Class, который является подклассом Enum.

Здесь вы выбрасываете всю общую проверку.

Смежные вопросы