有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

泛型在参数上强制子类Java类型

有没有办法在编译时对参数强制使用子类类型

类似于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在方法follow()上只使用Parrot参数一样

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


共 (1) 个答案

  1. # 1 楼答案

    这其中有一个诀窍

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

    首先:请注意,使用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类的签名中强制Fish