java - 我可以提供使用泛型类型的方法,其中泛型类型始终是类吗?

标签 java generics subclassing

我不确定我是否足够好地表达了这个问题,而且我找不到更好的方法来做到这一点,因为我对 java 还很陌生。

我相信最好是通过插图的方式,如果我有课

public abstract class Genome
{
    abstract public Genome randomize();
    abstract public Genome mutate();
    abstract public Genome crossOver(Genome genome);
}

我能否确保它的子类始终使用泛型来实现

public class GenomeSubclass extends Genome
{
    public GenomeSubclass randomize();
    // etc...
}

而不是合约中提供的抽象方法?

最佳答案

通常的方法是这样定义它:

public abstract class Genome<T extends Genome<T>> {
    abstract public T randomize();
    abstract public T mutate();
    abstract public T crossOver(T genome);
}

public class GenomeSubclass extends Genome<GenomeSubclass>
{
    public GenomeSubclass randomize();
    // etc...
}

这也是 Comparable(或者至少是 Comparable 的大多数用途)和 Enum 使用的方法。

当然,这并不能避免子类化其他子类。


编辑以详细说明我的评论:

你不能两者兼得

class GenomeSubclass extends Genome {
    public GenomeSubclass crossOver(GenomeSubclass other);
}

class GenomeSubSubclass extends GenomeSubclass {
    public GenomeSubclass crossOver(GenomeSubSubclass other);
}

两者都实现相同的基因组方法。 GenomeSubSubclass 的每个子类型都必须实现 crossOver(GenomeSubclass)方法,无法进一步限制论证。

当然,您可以提供GenomeSubclass具有自己的类型参数:

public class GenomeSubclass<T extends GenomeSubclass<T>> extends Genome<GenomeSubclass<T>>
{
    public GenomeSubclass<T> randomize();
    // etc...
}

但是如果不以某种方式返回到原始类型,您就无法真正直接使用此类。 (你必须写 GenomeSubclass<GenomeSubclass<GenomeSubclass<...>>> ,这实际上是不可能的。或者我在这里想错了。)


这里的原则思想是每个基因组子类型都用作类型参数 T将与其所有自己的子类型兼容。这意味着,我们可以这样:

public abstract class GenomeA extends Genome<GenomeA> {}

然后

public class AImpl1 extends GenomeA {
   public GenomeA randomize();
   public GenomeA mutate();
   public GenomeA crossOver(GenomeA other);
}

public class AImpl2 extends GenomeA {
   public GenomeA randomize();
   public GenomeA mutate();
   public GenomeA crossOver(GenomeA other);
}

关于java - 我可以提供使用泛型类型的方法,其中泛型类型始终是类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6272111/

相关文章:

c# - 返回或继承包含嵌套类的泛型

ios - PFObject 子类化 : NSArray element failed to match the Swift Array Element type

java - 如何将 JRE 从 1.8.0.241 更改为最新的 13

generics - Generic 类型的关闭参数 - 异常

java - 无法加载流口水 kie :ksession bean

swift - RxSwift 通用 `Cannot convert value of type ' (_) -> [任何 ]' to expected argument type ' (字符串) -> _'`

objective-c - 在子类中重铸属性

python - 动态选择从哪个子类继承方法?

java - 格式化数字的最佳设计模式是什么?

java - 如何合并 2 个数组?