我已经定义了转换器接口和几个转换器:
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;
}
}
导致两个转换器的编译错误,即incompatible types: Class<IntegerConverter> cannot be converted to Class<? extends StringConverter<T>>
。
使用原始类型我可以摆脱IntegerConverter编译错误,但我仍然得到EnumConverter的相同错误。 error: incompatible types: Class<EnumConverter> cannot be converted to 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;
}
}
任何帮助都将不胜感激。
答案 0 :(得分:1)
你可以这样做:
@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;
}
}
答案 1 :(得分:0)
<T>
和<?>
都是红色的!
就这样写:
@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;
}
}
编辑:
我以前没见过这个问题,所以我真的不知道原因。这是我的猜测:
<T>
不是真正的类型,因此只要投放到Class<? extends StringConverter<T>>
,就会发生错误,例如Class<IntegerConverter> cannot be converted to Class<? extends StringConverter<T>>
。IntegerConverter
使用实际类型<Integer>
实现,因此(Class<? extends StringConverter<Integer>>) IntegerConverter.class
将是正确的,(Class<? extends StringConverter<?>>) IntegerConverter.class
也可以。 EnumConverter
使用通用类型<E extend Enum<E>>
实现,因此EnumConverter.class
无法转换为任何类型为Class<? extends StringConverter<T>>
或Class<? extends StringConverter<?>>
的表单。
证明:
制定另一个实施方案:
public class GenericConverter<E> implements StringConverter<E> {
public E convert(String value) { return null; }
}
(Class<? extends StringConverter<T>>) GenericConverter.class
和(Class<? extends StringConverter<?>>) GenericConverter.class
都不正确。