为什么这个@Override不正确?

时间:2014-02-19 21:34:40

标签: java enums override

我想从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接口。

1 个答案:

答案 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!");