在参数上强制实施子类Java类型

时间:2018-04-16 14:34:03

标签: java generics inheritance parameters

有没有办法在编译时对参数强制执行子类类型?

类似于this而不是实例 - 类?

我有课程:

public abstract class Animal {

  public abstract void follow(Animal a); // <-- how to declare it?

}

但我希望子类永远不要使用Animal基类,而只是将自身(派生类)作为参数:

public class Fish extends Animal {

  @Override
  public void follow(Fish f) { // error here, since it expects Animal
    tagAlong(f);
  }

  private void tagAlong(Fish f) {
    // do something  
  }

}

我希望Fish仅使用Fish类型的参数,而不是Animal,这与另一个子类Parrot仅使用Parrot参数的方式相同关于方法follow()

我强烈希望在编译时强制执行此操作,但如果没有其他可能,则运行时是一个(不太理想的)选项。

1 个答案:

答案 0 :(得分:4)

这有一个诀窍。

从设计的角度来看,它很难看,但它会在你的情况下起作用。

首先要做的事情:请注意,使用useLiveLayout=false 进行参数化并在运行时检查类型并没有什么问题。

以下是如何使用与方法签名相同类型的参数强制继承:

Animal

您也可以声明一个通用方法// made class generic public abstract class Animal<T extends Animal<T>> { public abstract void follow(T a); } // parametrizes with own type public class Fish extends Animal<Fish> { @Override public void follow(Fish a) { // compiles } } ,使用follow进行参数化(并在签名中仅使用<T extends Animal>),但是您无法强制执行T Fish课程中的签名。