在参数上强制执行子类 Java 类型

The*_*ler 4 java generics parameters inheritance

有什么方法可以在编译时对参数强制使用子类类型吗?

类似this但不适合实例 - 对于类?

我有课程:

public abstract class Animal {

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

}
Run Code Online (Sandbox Code Playgroud)

但我希望子类永远不要使用基类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  
  }

}
Run Code Online (Sandbox Code Playgroud)

我希望 aFish仅使用类型的参数Fish,而不是Animal像另一个子类Parrot仅使用Parrot方法上的参数一样follow()

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

Men*_*ena 5

这有一个技巧。

从设计的角度来看,它很丑陋,但它适用于您的情况。

首先,请注意,使用 进行参数化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
    }

}
Run Code Online (Sandbox Code Playgroud)

您还可以声明一个通用方法follow,用<T extends Animal>(并且仅T在签名中)进行参数化,但不能Fish在类中的签名中强制执行Fish