У меня есть код, поддерживающий сопоставление прото-перечислений с их полными именами дескрипторов, например:
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 общаются здесь
1722628122
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(...)?
[b]Изменить:
I немного переработал свой код, чтобы выполнить приведение типов в EnumRegistery:[/b]
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)
Подробнее здесь: [url]https://stackoverflow.com/questions/78822163/casting-class-extends-enum-to-classt-extends-enumt[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия