我想从Apache Commons BeanUtils实现以下接口:
public interface Converter {
// Convert the specified input object into an output object of the specified type
<T> T convert(java.lang.Class<T> tClass, java.lang.Object o);
}
我的实现应该采用Enum的子类,并将String对象转换为指定类型的枚举。我试图使用以下声明:
class EnumConverter implements Converter {
@Override
public Enum convert(Class<Enum> tClass, Object o) {
...
}
}
但编译器不同意我的看法。它输出:
错误:EnumConverter不是抽象的,不会覆盖抽象 转换器中的方法convert(Class,Object)
错误:名称冲突: 转换(Class,Object)在EnumConverter和 转换器中的convert(Class,Object)具有相同的擦除功能 既不会覆盖其他
错误:方法不会覆盖或 从超类型
实现一个方法
我的实施有什么问题?
UPD。请仔细阅读这个问题。我无法在Apache Commons BeanUtils库中更改Converter接口。
答案 0 :(得分:3)
convert
中的EnumConverter
方法不是通用的,因为convert
中的Converter
方法是通用的。如果要实现的方法定义了自己的类型参数,那么重写方法也必须这样做。
但是,您看起来需要泛型类型参数为Enum
。如果是这样,那么接口Converter
必须是通用的,而不是方法。 convert
方法将引用其接口的泛型类型参数,而不是定义它自己的。
interface Converter<T> {
// Convert the specified input object into an output object of the specified type
T convert(java.lang.Class<T> tClass, java.lang.Object o);
}
然后,您可以在实现界面时指定Enum
。
class EnumConverter implements Converter<Enum>{
@Override
public Enum convert(Class<Enum> tClass, Object o) {
...
}
}
如果您无法更改界面,那么必须使用相同的通用方法实现泛型方法。您无法添加任何边界,例如<T extends Enum<T>>
。
class EnumConverter implements Converter{
@Override
public <T> T convert(Class<T> tClass, Object o) {
...
}
}
如果您希望它只与枚举一起使用,那么您必须在运行时强制执行它:
if (!Enum.class.isAssignableFrom(tClass))
throw new IllegalArgumentException("Class must specify an Enum!");