Java 泛型类枚举返回类型
我定义了一个转换器接口和两个转换器:Java 泛型类枚举返回类型,java,generics,enums,Java,Generics,Enums,我定义了一个转换器接口和两个转换器: public interface StringConverter<T> { T convert(String value); } public class EnumConverter<E extends Enum<E>> implements StringConverter<E>{ private final Class<E> enumClass; public EnumConve
public interface StringConverter<T> {
T convert(String value);
}
public class EnumConverter<E extends Enum<E>> implements StringConverter<E>{
private final Class<E> enumClass;
public EnumConverter(Class<E> enumClass) {
this.enumClass = enumClass;
}
@Override
public E convert(String value) {
return Enum.valueOf(enumClass, value);
}
}
public class IntegerConverter implements StringConverter<Integer> {
public Integer convert(String value) {
return Integer.parseInt(value);
}
}
公共接口字符串转换器{
T转换(字符串值);
}
公共类EnumConverter实现StringConverter{
私有最终类枚举类;
公共枚举转换器(类枚举类){
this.enumClass=enumClass;
}
@凌驾
公共E转换(字符串值){
返回Enum.valueOf(enumClass,value);
}
}
公共类IntegerConverter实现StringConverter{
公共整数转换(字符串值){
返回整数.parseInt(值);
}
}
我创建了一个返回StringConverter类的工厂接口
public interface StringConverterClassFactory {
<T> Class<? extends StringConverter<T>> getConverter(Class<T> forType);
}
公共接口StringConverterClassFactory{
Class您可以这样做:
@SuppressWarnings({ "unchecked", "rawtypes" })
public <T> Class<? extends StringConverter<T>> getConverter(Class<T> forType) {
if (forType.equals(int.class) || forType.equals(Integer.class)) {
return (Class) IntegerConverter.class;
} else if (forType.isEnum()) {
return (Class) EnumConverter.class;
} else {
return null;
}
}
@Override
public Class<? extends StringConverter> getConverter(Class forType) {
if (forType.equals(int.class) || forType.equals(Integer.class)) {
return IntegerConverter.class;
} else if (forType.isEnum()) {
return EnumConverter.class;
} else {
return null;
}
}
@SuppressWarnings({“unchecked”,“rawtypes”})
公共类和
都是redundent
就这样写吧:
@SuppressWarnings({ "unchecked", "rawtypes" })
public <T> Class<? extends StringConverter<T>> getConverter(Class<T> forType) {
if (forType.equals(int.class) || forType.equals(Integer.class)) {
return (Class) IntegerConverter.class;
} else if (forType.isEnum()) {
return (Class) EnumConverter.class;
} else {
return null;
}
}
@Override
public Class<? extends StringConverter> getConverter(Class forType) {
if (forType.equals(int.class) || forType.equals(Integer.class)) {
return IntegerConverter.class;
} else if (forType.isEnum()) {
return EnumConverter.class;
} else {
return null;
}
}
@覆盖
公共类>
证明:
实施另一个目标:
公共类GenericConverter实现StringConverter{
公共E转换(字符串值){return null;}
}
(Class>)和GenericConverter.Class
都不正确
这会导致IntegerConverter和EnumConverter都出现编译错误。@BrandonJohnson编辑您的超级接口类这是可行的。您能解释一下EnumConverter.class与(类>)不兼容的原因吗,(ClassI在四处寻找类似的东西时发现了这一点:@BrandonJohnson:EnumConverter。class
具有类型class
,它不是class>
的子类型,因为EnumConverter
不是StringConverter
的子类型。原因是EnumConverter
是泛型;使用其原始类型将关闭所有泛型,包括其继承中的泛型。您可以说EnumConverter
是StringConverter
的子类型,或者EnumConverter
是StringConverter
的子类型,但不能说EnumConverter
是StringConverter
的子类型。