Кастинг-класс> до Class>JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Кастинг-класс> до Class>

Сообщение Anonymous »

У меня есть код, поддерживающий сопоставление прото-перечислений с их полными именами дескрипторов, например:
class EnumRegistry {

Map> getEnumClass(String enumTypeName) {
return checkNotNull(ENUM_DESCRIPTOR_MAP.get(enumTypeName), "Unsupported enum type");
}
}

У меня есть еще один фрагмент кода, который должен передать класс перечисления методу с этой сигнатурой:
class OtherClass {
// Gets some stored enum value
public T getEnum(Class clazz) {
//... some work
}
}

Идея этого кода будет выглядеть так:
String enumDescriptor = "some.package.Status"
OtherClass other = new OtherClass();
other.getEnum(EnumRegistry.getEnumClass(enumDescriptor));

Это неудовлетворительный код с ошибкой типа:
method getEnum in class package.Other cannot be applied to given types;
required: java.lang.Class
found: java.lang.Class
upper bounds: java.lang.Enumjavac(compiler.err.cant.apply.symbol)

У меня есть обходной путь с использованием вспомогательного метода, который решает проблему компилятора путем введения вспомогательного метода:
public void doWork() {
String enumDescriptor = "some.package.Status";
OtherClass other = new OtherClass();
getEnumValue(enumDescriptor, other);
}

// Required helper method to make compiler happy
@SuppressWarnings("unchecked")
private T getEnumValue(String enumDescriptor, OtherClass other) {
Class enumClass = (Class) EnumRegistry.getEnumClass(enumDescriptor);
return other.getEnum(enumClass);
}

Мой вопрос: почему обходной путь скрывает ошибку? Есть ли более интуитивный способ сообщить компилятору тип класса перечисления при вызове OtherClass.getEnum(...)?
Изменить:
I немного переработал свой код, чтобы выполнить приведение типов в EnumRegistery:

class EnumRegistry {

// ...

@SuppressWarnings("unchecked")
public static Class getEnumClass(String enumTypeName) {
Class> enumClazz = checkNotNull(ENUM_DESCRIPTOR_MAP.get(enumTypeName), "Unsupported enum type");
return (Class) enumClass;
}
}

Это позволяет мне, по крайней мере, избежать приведения за пределами этого файла, но я все равно вынужден использовать шаблонный вспомогательный метод:
public void doWork() {
String enumDescriptor = "some.package.Status";
OtherClass other = new OtherClass();
getEnumValue(enumDescriptor, other);
}

// required helper method to make compiler happy
private T getEnumValue(String enumDescriptor, OtherClass other) {
Class enumClass = EnumRegistry.getEnumClass(enumDescriptor);
return other.getEnum(enumClass);
}

И под этим я подразумеваю, что компилятор не позволит мне напрямую передать значение:
String enumDescriptor = "some.package.Status"
OtherClass other = new OtherClass();
other.getEnum(EnumRegistry.getEnumClass(enumDescriptor)); // Does not compile

Выдает довольно неприятную ошибку типа:
method getEnum in class OtherClass cannot be applied to given types;
other.getEnum(
^
required: Class
found: Class
reason: inferred type does not conform to upper bound(s)
inferred: T#3
upper bound(s): Enum,Enum
where T#1,T#2,T#3,T#4,T#5 are type-variables:
T#1 extends Enum declared in method getEnum(Class)
T#2 extends Enum
T#3 extends Enum
T#4 extends Enum
T#5 extends Enum declared in method getEnumClass(String)


Подробнее здесь: https://stackoverflow.com/questions/788 ... ends-enumt
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»