【问题标题】:Why this @Override is incorrect?为什么这个@Override 不正确?
【发布时间】:2014-03-20 12:28:29
【问题描述】:

我想从 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 不是抽象的并且不会覆盖抽象 Converter 中的方法 convert(Class,Object)

错误:名称冲突: EnumConverter 中的 convert(Class,Object) 和 Converter 中的 convert(Class,Object) 具有相同的擦除,但是 两者都不会覆盖另一个

错误:方法没有覆盖或 从超类型实现方法

我的实现有什么问题?

UPD。请更仔细地阅读问题。我无法更改它在 Apache Commons BeanUtils 库中的转换器接口。

【问题讨论】:

  • 您还需要使您的界面通用。
  • @DaveNewton “我想从 Apache Commons BeanUtils 实现以下接口”。它是一个第三方库,我无法更改它。

标签: java enums overriding


【解决方案1】:

EnumConverter 中的 convert 方法不像 Converter 中的 convert 方法那样通用。如果要实现的方法定义了自己的类型参数,那么覆盖方法也必须这样做。

但是,您似乎需要将泛型类型参数设为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) {
        ...
    }
}

如果你不能改变接口,那么你必须用同样的泛型方法实现一个泛型方法。不能添加任何边界,例如&lt;T extends Enum&lt;T&gt;&gt;

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

【讨论】:

  • 能否请您为我的案例编写正确的类定义(不更改转换器接口)?
  • 我无法更改转换器界面。
  • 太棒了。谢谢你的详细解答。
猜你喜欢
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多