Java在超类方法中返回不带通用参数的子类

早晨

我真的很喜欢使用初始化程序来使构造和配置类更容易理解。基本上我更喜欢这样:

new ClassObj().StartingFrom(1).EndingAt(5).IncrementBy(1).Backwards();

而不是这样:

new ClassObj(1,5,1,false);

当Java与继承混合在一起时,这有点麻烦,因为返回类型默认为尽可能通用。我发现了使用自引用继承(Java:在超类方法签名中返回子类的可行解决方案,但是我遇到了一些问题。

我的问题是Parent类实现Iterable,但是通用类型参数丢失了,因此for-each循环想返回一个Object而不是File。

这是一个显示行为的SSCCE:

public class SSCCE {
  private static abstract class Sentence<T extends Sentence<T>> implements Iterable<String> {
    protected LinkedList<String> Words = new LinkedList<>();

    abstract T self();

    public T Say(String word) {
      Words.add(word);
      return self();
    }

    @Override
    public Iterator<String> iterator () {
      return Words.iterator();
    }
  }

  static class QuietSentence extends Sentence<QuietSentence> {
    public QuietSentence Whisper(String word) {
      Say(word.toLowerCase());
      return this;
    }

    @Override
    QuietSentence self() {
      return this;
    }
  }

  static class LoudSentence extends Sentence<LoudSentence> {
    public LoudSentence Shout(String word) {
      return Say(word.toUpperCase());
    }

    @Override
    LoudSentence self() {
      return this;
    }
  }

  static void PrintWords(Sentence words) {
    for(Object obj : words) {
        // I'd really like to avoid this cast
        String word = (String)obj;
        System.out.println(new StringBuilder(word).append(": ").append(word.length())
                  .toString());
    }
  }

  public static void main (String[] args) {
    QuietSentence peaceful_words = new QuietSentence().Say("Hello").Whisper("World");
    PrintWords(peaceful_words);

    LoudSentence noisy_words = new LoudSentence().Say("Hello").Shout("World");
    PrintWords(noisy_words);
  }
}

怎么回事,我该如何解决?

早晨

因此,事实证明问题出在我没有正确指定类型。PrintWords功能的最小修复可以解决该问题。

static void PrintWords(Sentence<? extends Sentence> words) {
    for(String word : words) {
        System.out.println(new StringBuilder(word).append(": ").append(word.length())
                .toString());
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

子类中的参数化超类方法和非参数化(混凝土类型)方法

如何使超类方法返回子类的实例

子类中的方法可以重载超类中的方法吗?

将通用子类型类信息传递给Java中的超类

将子类传递给方法,但将超类作为参数?

Java:在超类方法签名中返回子类

Java getMethod在方法中具有超类参数

Java:强制子类重写超类的方法

Java:超类中的同步方法获得与子类中相同的锁,对吗?

Java中的通用类参数

如何使用子类或超类定义Java函数的返回类型和参数?

如何确保某些方法从子类(Java)中的方法从抽象超类中调用

子类java中的“重写”超类成员

如何在Java中从其超类方法停止/退出子类方法执行

超类引用无法在Java中调用子类方法

Java继承:在超类中调用子类方法

如何从超类方法而不是超类类型返回子类型

从函数而不是子类返回通用超类

Java:从超类构造函数中的子类调用的方法

在Java中,“ this”在继承该方法的子类上调用的超类方法中表示什么?

有没有更简单的方法可以在Java中的子类和超类的ArrayList上调用子类的方法

返回不带参数化参数的通用列表

您如何在Java中从超类调用子类方法?

C ++-使指向超类的指针与函数中的子类参数匹配

在子类上调用虚拟方法将返回超类数据

如何在超类方法中使用子类参数?

从 Java 中超类类型的 ArrayList 调用子类方法

对子类中的子类方法使用超类参数

在子类python3中获取超类输入参数