Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用泛型作为Java的方法参数_Java_Generics_Interface_Overriding_Abstract Class - Fatal编程技术网

使用泛型作为Java的方法参数

使用泛型作为Java的方法参数,java,generics,interface,overriding,abstract-class,Java,Generics,Interface,Overriding,Abstract Class,我有一个界面: 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 Artif

我有一个界面:

    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);
    }
}
我还有一个实现该接口的抽象类:

    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类型的方法alterT必须重写或实现一个超类型方法

我希望实现AbstractDDL操作的所有子类都传递不同类型的参数,所有这些参数都从工件类扩展到方法alter、create和drop

有人能就这个问题提出建议吗


谢谢。

您的类应该实现DDL操作,而不是原始DDL操作

应该是:

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

否则,抽象类的方法不会重写或实现任何超级类型接口方法,因此@override注释不正确。

您的类应该实现DDL操作,而不是原始DDL操作

应该是:

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

否则,抽象类的方法不会重写或实现任何超级类型接口方法,因此@override注释是不正确的。

感谢它解决了这个问题,但我还有另一个问题:当我在抽象类中调用alterartifact时,它给出了另一个错误:类型AbstractDDL操作中的方法Alter不适用于arguments工件。对此有什么建议吗?@TuncerTunçer请编辑您的问题,将导致此错误的代码包括在内。这是因为您将接口定义为只接受实现工件的T,而不接受任何实现工件的类Artifact@TuncerT. alter接受T类型的参数,而不是任何工件。如果您使用新的ConcreteDDL操作实例化了您的类或抽象类的某个具体子类,那么您将只能传递一些工件实例以进行更改。如果可能的话,也许您的createArtifactchildElement方法应该更改为返回T。@GonenI工件只是其他类型工件的一个超类,如索引、表等。因此,如果我理解正确,您会说,方法alterartifact的参数应该是子类,而不是超类。如果我将参数强制转换为工件会发生什么?谢谢,它解决了问题,但我有另一个问题:当我在抽象类中调用alterartifact时,它会给出另一个错误:类型AbstractDDL操作中的方法alterT不适用于参数工件。对此有什么建议吗?@TuncerTunçer请编辑您的问题,将导致此错误的代码包括在内。这是因为您将接口定义为只接受实现工件的T,而不接受任何实现工件的类Artifact@TuncerT. alter接受T类型的参数,而不是任何工件。如果您使用新的ConcreteDDL操作实例化了您的类或抽象类的某个具体子类,那么您将只能传递一些工件实例以进行更改。如果可能的话,也许您的createArtifactchildElement方法应该更改为返回T。@GonenI工件只是其他类型工件的一个超类,如索引、表等。因此,如果我理解正确,您会说,方法alterartifact的参数应该是子类,而不是超类。如果我将参数转换为Artifact,会发生什么?