【问题标题】:Interface inheritence in JavaJava中的接口继承
【发布时间】:2020-08-23 15:05:47
【问题描述】:

在:

// services
public interface Mother { public Collection<? extends Father> getMamaStuff() {}} 
public interface Daughter extends Mother {}

// data
public interface Father { public String getPapaStuff() }
public interface Son extends Father { public String playLoudMusic() }

为什么不允许这样做:

public class Clazz {

    Clazz(Daughter daughter) {//boilerplate}

    public Collection<Son> idk = doughter.getMamaStuff();
}
  1. 是不是因为没有办法知道Father的哪个实现 克拉兹会得到吗?
  2. 解决此问题的好方法是什么?
  3. 在这种情况下 instanceof 是好的做法吗?

在我看来,类型检查是没有办法的。

【问题讨论】:

  • 没有“女儿”这样的东西,你希望它如何工作?母亲包含一系列被称为“mamaStuff”的父亲?女儿延长妈妈????你对世界的看法似乎很奇怪。它不起作用的原因是因为它在您在构造函数中设置女儿的值之前被调用。
  • 仅供参考:你怎么知道Daughter是否应该扩展Mother而不是相反?
  • 修复拼写错误后,我的IDE,也就是Eclipse,显示如下编译错误:Type mismatch: cannot convert from Collection&lt;capture#1-of ? extends Father&gt; to Collection&lt;Son&gt;你也一样吗?
  • 是的,有人会在 Class 中传递一些东西,这是其中一些接口的实际实现。我知道继承链是正确的,因为这是我所处的情况,我也在扩展框架功能,为了解决一些构造函数的抱怨,Clazz 的实例化方式并不重要,因为这不会影响手头的问题.

标签: java inheritance interface multiple-inheritance


【解决方案1】:

不允许的原因:

interface Feline { }
interface Kitten extends Feline {}
interface Tiger extends Feline {}

...

Cage<? extends Feline> makeCage();

// at this point, it's actually really important that 
// the right kind of cage was created...
makeCage().put(new Tiger());

参数化Mother 可能适用于您的情况:

public interface Mother<T extends Father> { 
  public Collection<T> getMamaStuff(); {}
}

【讨论】:

  • tnx!我不能碰妈妈这是框架的东西。你能解释一下参数化是如何解决这个问题的吗?我不确定我明白了
  • 如果 Mother 是参数化的(就像我在示例中展示的那样),它可以接受要使用的父亲类的类型,然后 getMamaStuff() 将返回正确类型的集合。但如果是来自框架,就无能为力了
【解决方案2】:

在修复您提供的损坏代码之后。

编译器所知道的是,我们从母亲那里得到的是它是对父亲的扩展。它不知道具体是son

编译器不会强制转换为 ju。

所以我们可以在集合中拥有something that extends father

// services
public interface Mother { public Collection<? extends Father> getMamaStuff(); {}}
public interface Daughter extends Mother {}

// data
public interface Father { public String getPapaStuff(); }
public interface Son extends Father { public String playLoudMusic(); }

public class Clazz {

    Clazz(Daughter daughter) {//boilerplate}

        Collection<? extends Father> idk = daughter.getMamaStuff();
    }
}

【讨论】:

  • 嗯,有趣的解决方案,我喜欢它,但现在我不能使用儿子特定的东西。有什么想法吗?
  • 如果你想使用 son 特定的东西,你需要强制转换它,这就是为什么如果你研究说 List&lt;T&gt; 实现,一切都继承自 Collection&lt;?&gt; 一切都继承了一种行为,他们不'不扩展行为。
  • 好的,也就是说,instanceof没有办法了?
  • 在这种情况下我不这么认为。但我不是仿制药专家,这完全取决于你的目标是什么。要知道的一件事是编译器不会检查“哦,所以这扩展了这个,或者这扩展了那个”
猜你喜欢
  • 1970-01-01
  • 2019-05-08
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多