我不确定我是否足够好地表达了这个问题,而且我找不到更好的方法来做到这一点,因为我对 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/