【问题标题】:Using generics as method parameter Java使用泛型作为方法参数 Java
【发布时间】:2020-05-24 22:46:40
【问题描述】:

我有一个界面:

    public interface DDLOperation <T extends Artifact> {

    public void alter(T artifact);

    public void create(T artifact);

    public void drop(T artifact);

} 

我还有一个实现该接口的抽象类:

    public abstract class AbstractDDLOperation <T extends Artifact> implements DDLOperation {

    @Override
    public abstract void alter(T artifact);

    @Override
    public abstract void create(T artifact);

    @Override
    public abstract void drop(T artifact);

    public void processChildElement(Element childElement) {
        Artifact artifact = createArtifact(childElement);
        alter(artifact);
    }
}

Eclipse 在 AbstractDDLOperation 类中出现此错误:AbstractDDLOperation 类型的方法 alter(T) 必须覆盖或实现超类型方法

我希望所有实现 AbstractDDLOperation 的子类都传递不同类型的参数,所有参数都从 Artifact 类扩展到方法 alter、create 和 drop。

任何人都可以就这个问题提出建议吗?

谢谢。

【问题讨论】:

    标签: java generics interface overriding abstract-class


    【解决方案1】:

    你的类应该实现DDLOperation&lt;T&gt;,而不是原始的DDLOperation

    应该是:

    public abstract class AbstractDDLOperation <T extends Artifact> implements DDLOperation<T>
    

    否则,您的抽象类的方法不会覆盖或实现任何超类型(接口)方法,因此@Override 注释不正确。

    【讨论】:

    • 感谢它解决了问题,但我还有另一个问题:当我在抽象类中调用 alter(artifact) 时,它给出了另一个错误:AbstractDDLOperation 类型中的方法 alter(T)不适用于参数 (Artifact) 。关于这个有什么建议吗?
    • @TuncerTunçer 请编辑您的问题以包含导致此错误的代码。
    • 这是因为您定义的接口只接受 T (恰好实现了 Artifact ),而不是任何实现 Artifact 的类
    • @TuncerT。 alter 接受 T 类型的参数,而不是任何工件。如果您使用new ConcreteDDLOperation&lt;SomeArtifact&gt;() 实例化您的类(或者实际上是抽象类的一些具体子类),您将只能将SomeArtifact 实例传递给alter()。也许您的createArtifact(childElement) 方法应该更改为返回T(如果可能)。
    • @GonenI Artifact 只是其他类型工件的超类,如索引、表等。所以如果我理解正确,你说的是,方法 alter(artifact) 的参数应该是子类,而不是超类。如果我将参数强制转换为 Artifact 会发生什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多