在超类中定义泛型类型,它指的是它所在的子类的类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在超类中定义泛型类型,它指的是它所在的子类的类型相关的知识,希望对你有一定的参考价值。

题 有没有办法在超类中实现泛型类型或类似的东西,它总是引用它所在的子类?

解释我需要什么

我有超类

public abstract class MySuperclass{

   public abstract *magicalTypeReference* getInstance();

}

当我创建它的子类时,我希望* magicalTypeReference *成为它所在的子类的类型。

public class FirstSubclass extends MySuperclass{

  @Override
  public FirstSubclass getInstance(){return this;}

}

public class SecondSubclass extends MySuperclass{

  @Override
  public SecondSubclass getInstance(){return this;}

}

为什么普通的通用类型不能完成这项工作

从技术上讲,通用类型可以做类似的事情。

public abstract class MySuperclass<E extends MySuperclass>{

   public abstract E getInstance();

}

public class FirstSubclass extends MySuperclass<FirstSubclass>{

  @Override
  public FirstSubclass getInstance(){return this;}

}

public class SecondSubclass extends MySuperclass<SecondSubclass>{

  @Override
  public SecondSubclass getInstance(){return this;}

}

但泛型类型不保证以后的类型被强制为子类。从技术上讲,您可以使用另一个子类作为泛型类型来创建子类。像这样

public class SecondSubclass extends MySuperclass<FirstSubclass>{

  @Override
  public FirstSubclass getInstance(){return this;}

}

java中是否有一些构造可以提供“类型安全”的实现方式?

答案

这在Java中是不可能的。

考虑假设你想要什么是可能的,你可以像这样实现FirstSubclass

public class FirstSubclass extends MySuperclass {

  @Override
  public FirstSubclass getInstance() { return new FirstSubclass(); }

}

然后你可以有一个子类,它不会覆盖getInstance()方法:

public class SubSubclass extends FirstSubclass { }

由于继承,SubSubclass还实现了MySuperclass接口。然而,SubSubclassgetInstance()方法继承自FirstSubclass,它返回FirstSubclass。因此,SubSubclass不满足MySuperclass接口的合同,因为它的getInstance()方法不返回SubSubclass

另一答案

而不是宣布你的MySuperClass喜欢

public abstract class MySuperClass<E extends MySuperClass>

如果你宣布像

public abstract class MySuperClass<E extends MySuperClass<E>>

您可以使子类避免在某种意义上相互引用。

这个解决方案肯定会避免这样的情况

public class SecondSubclass extends MySuperclass<FirstSubclass>{

@Override
public FirstSubclass getInstance(){return this;}

}

public class FirstSubclass extends MySuperclass<SecondSubclass>{

@Override
public SecondSubclass getInstance(){return this;}

}

其中一个类包含另一个类,反之亦然。

以上是关于在超类中定义泛型类型,它指的是它所在的子类的类型的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 在超类的覆盖函数中返回子类类型

马凯军201771010116《面向对象程序设计(java)》第七周学习总结

Hibernate在超类中定义@Where注解

方法“转换”未在超类中定义

swift 学习- 14 -- 继承

如何使用超类中声明的方法返回子类的实例? [复制]