У меня есть код, поддерживающий сопоставление прото-перечислений с их полными именами дескрипторов, например:
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
Кастинг-класс расширяет Enum>> до Class> ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Java: Т объект; тип obj.getClass() — Class>, а не Class расширяет Т>. почему?
Anonymous » » в форуме JAVA - 0 Ответы
- 38 Просмотры
-
Последнее сообщение Anonymous
-