Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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_Overriding - Fatal编程技术网

Java 泛型优先于混淆

Java 泛型优先于混淆,java,generics,overriding,Java,Generics,Overriding,我的班级结构如下 public abstract class X { } public class Y extends X { } 我想做以下几点: public abstract class Action { public abstract <T extends X> void execute(T t); } public class SomeAction extends Action { public void execute(Y y) { } } 公共抽象集体诉讼

我的班级结构如下

public abstract class X { }
public class Y extends X { }
我想做以下几点:

public abstract class Action {
  public abstract <T extends X> void execute(T t);
}

public class SomeAction extends Action {
  public void execute(Y y) { }
}
公共抽象集体诉讼{
公开摘要无效执行(T);
}
公共集体诉讼延伸了诉讼{
公共无效执行(Y){}
}
编译器给了我以下错误:

类型
SomeAction
必须实现继承的抽象方法
Action.execute(T)

我确实希望重写
execute()
,但我希望参数是
X
的子类

我在这里做错了什么?

public void execute(T);
  public <T extends X> void execute(T t);
是一个抽象的方法,因为它没有任何主体。它应该被标记为抽象的

因此,在您的子类中,您需要重写该类或将方法和子类都标记为抽象类。

public void execute(T);
是一个抽象的方法,因为它没有任何主体。它应该被标记为抽象的


因此,在您的子类中,您需要重写该类,或者将方法和子类都标记为抽象类。

尝试将类
操作
设置为泛型,而不是其方法之一

public abstract class Action<T extends X>
{
   public abstract void execute(T t);
}

尝试将类
Action
设置为泛型,而不是其方法之一

public abstract class Action<T extends X>
{
   public abstract void execute(T t);
}

听起来您希望
T extends X
成为类extending
Action
的属性,而不是方法调用。你应该写

 public abstract class Action<T extends X> {
   public abstract void execute(T t);
 }
公共抽象集体诉讼{
公开摘要无效执行(T);
}
然后

 public class SomeAction extends Action<Y> {
    ...
 }
public类SomeAction扩展了Action{
...
}

听起来您希望
T extends X
成为类extending
Action
的属性,而不是方法调用。你应该写

 public abstract class Action<T extends X> {
   public abstract void execute(T t);
 }
公共抽象集体诉讼{
公开摘要无效执行(T);
}
然后

 public class SomeAction extends Action<Y> {
    ...
 }
public类SomeAction扩展了Action{
...
}

您正在打破Liskov原则:基本操作的
执行
方法能够执行任何类型的X。但是在子类中,您将其限制为仅执行Y个实例。这是在减少契约,而不是扩展契约。

您正在打破Liskov原则:基本操作的
execute
方法能够执行任何类型的X。但是在子类中,您将其限制为仅执行Y个实例。这是减少合同,而不是延长合同。

那又怎样?它仍然通过其公共方法定义契约,并且所有实现都必须遵守契约。Action类中的泛型方法涉及使用类型调用它并让它返回相同的类型。它与重写方法无关。正如@JBNizet所解释的,重写必须与父级中方法的签名相匹配。。。包括它的一般方面。非常感谢您的讨论。我最初的问题是我想要有多个动作,但每个动作都有不同的参数。有什么好办法来处理它吗?如果你愿意,我可以再问一个问题。那又怎样?它仍然通过其公共方法定义契约,并且所有实现都必须遵守契约。Action类中的泛型方法涉及使用类型调用它并让它返回相同的类型。它与重写方法无关。正如@JBNizet所解释的,重写必须与父级中方法的签名相匹配。。。包括它的一般方面。非常感谢您的讨论。我最初的问题是我想要有多个动作,但每个动作都有不同的参数。有什么好办法来处理它吗?如果你愿意,我可以再问一个问题。