我定义了一个转换器接口和几个转换器:
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);
}
}
我创建了一个工厂接口,返回StringConverter类。
public interface StringConverterClassFactory {
<T> Class<? extends StringConverter<T>> getConverter(Class<T> forType);
}
我在StringConverterClassFactory实现方面遇到了问题。
public class DefaultConverterClassFactory implements StringConverterClassFactory {
@Override
public <T> Class<? extends StringConverter<T>> getConverter(Class<T> forType) {
if(forType.equals(int.class) || forType.equals(Integer.class))
return (Class<? extends StringConverter<T>>)IntegerConverter.class;
else if(forType.isEnum())
return (Class<? extends StringConverter<T>>)EnumConverter.class;
else
return null;
}
}
两个转换器都会导致编译错误,即不兼容类型:Class <IntegerConverter>无法转换为Class<? extends StringConverter<T>>
。
使用原始类型可以解决IntegerConverter的编译错误,但对于EnumConverter仍然出现相同的错误。错误:不兼容的类型:Class<EnumConverter>无法转换为Class<? extends StringConverter<?>>
public class DefaultConverterFactory implements StringConverterClassFactory {
@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 (Class<? extends StringConverter<?>>) EnumConverter.class;
else
return null;
}
}
非常感谢您的帮助。
EnumConverter.class
的类型是Class<EnumConverter>
,它不是Class<? extends StringConverter<?>>
的子类型,因为EnumConverter
不是StringConverter<?>
的子类型。原因是EnumConverter
是一个泛型类型;使用其原始类型会关闭所有泛型,包括其继承中的泛型。你可以说EnumConverter<?>
是StringConverter<?>
的子类型,或者EnumConverter
是StringConverter
的子类型,但不能说EnumConverter
是StringConverter<?>
的子类型。 - newacct