接口扩展是否等同于继承? (Java)

Is an interface extension equivalent to inheritance? (Java)

我有一个关于继承定义的理论问题。一个月前考过,要给个继承的例子

这是我的回答:

public interface UserRepository extends CrudRepository<User, Long>

根据定义,extend 关键字表示正在定义的 class 是使用继承从基派生的。 但是,我的教授将这个答案评为错误,并评论说我的示例是接口扩展,与继承无关。

接口扩展和继承有什么区别?为什么我回答错了,我是不是把继承的定义搞混了?

文字是用来传达意思的工具。如果我说“Student 接口继承自 Person 接口”,那么我使用的词是 'good',根据定义,如果每个听到我的人立即凭直觉我们有:

public interface Student extends Person {}

如果听到我/阅读我文字的部分或全部人不这样做,那么这个词从定义上来说就是不好的。

句号.

问题是,如果'audience'很大,不方便枚举怎么办?如果我写的博客 post 或 SO 答案会在未来 20 年内获得几十万的浏览量怎么办?今天 有点难问一个阅读答案 15 年的人是否真正正确地理解了我用来表达的意思。

这是抱怨正确使用术语的唯一一点。显然,没有法律规定调用 'inheritance' 是非法的。有 4 个有用的来源:

  • 观众的知识,如果那是可知的。对于未来 20 年将被阅读的 SO 答案,这是不可知的。在教室里,它是。在开发团队的对话中,它肯定是。如果每个人都称这种 extends 关键字的用法,出于某种原因,“Student ixtends Person”(我编的),那么就应该使用这个词。在这里教学的作用当然是教最有可能将你的意思传达给尽可能广泛的听众,所以这个来源基本上是无关紧要的。
  • 官方定义。官方的,官方的。不是 'my teacher said so',也不是 'this textbook said so'。那本教科书只是某人写的,而不是由某种法官+陪审团+刽子手写的。但规格有一定的分量。那就来看看吧!

JLS §9.1.3:

If an extends clause is provided, then the interface being declared extends each of the other named interfaces and therefore inherits the member types, instance methods, and constants of each of the other named interfaces.

非常接近:“继承成员类型”,直接来自规范。我会说你的老师充满了它,并且正在教授他们的个人喜好作为唯一正确的答案。如果您愿意,请与他们对质,并确保打印出 §9.1.3 并展示给他们看。

为了真正理解它,这里是关于 extending class 定义的相关部分:JLS §8.1.4 - 这没有提到“继承”这个词 完全没有,所以按照规格你的老师是完全错误的。

  • 常见 'slang' - Jane Q. Average Coder 倾向于假设这个词的意思是什么?我非常确定几乎每个 java 程序员都会直觉地认为“继承”这个词至少意味着 class X extends Y,并且至少会思考:“......并且可能还会 interface A extends B,甚至可能 class X implements B。换句话说,按照这个定义,如果区别很重要,那么 术语是无关紧要的 - 当你说“A 继承自 B”时不是泛泛而谈,而是想具体表达 A 和 B 是 类,特别是 不是 接口,那么那句话 不符合目的 - 它不会传达那个想法。JLS、你的老师或任何手册或定义书说什么都没关系。这显然不能真正确定答案,尽管它强烈建议你'是的。要 'prove' 你必须,我不知道,去拿个麦克风在 java 会议周围走走,问问人们他们认为这意味着什么。

  • 某种公认的事实来源。有几本书如此受人尊敬,以至于普遍受到信任;换句话说,这是一本非常值得信赖的书,如果您说:“......并且 [这本神圣的书] 同意,请参阅 [第 link 章]”,您几乎会立即赢得任何争论。在 java 中, 可能 那是 Effective Java,但是书很烦人,因为你不能轻易地 link 以任何人都可以的方式阅读它们验证(他们必须先购买这本书)。我现在没有这本书,但我非常怀疑它在这里选择了任何一方,它不是那种书。

...就是这样。

这很复杂,但本质上,你的老师在这里错了。把它记下来是愚蠢的。给老师带来疑问的好处,他们事先告诉您,该练习涉及记住任意无意义的东西,并且您会根据记住任意规则的能力进行评分;考试和java关系不大,更像是一个记忆游戏,有java个概念。像这样的教学有一些教学基础,但你可以进行这样的测试,而不必诉诸于以如此精确的方式定义模糊术语如 'inheritance' 的含义,所以,虽然这样做的好处是有疑问,这意味着 grade-down 很好,但他们的教学方法很糟糕。

随时向他们展示这个答案,如果他们想讨论更细微的问题,他们可以发表评论。

好吧,Java Language Specification § 9.1.3 提到了这个:

If an extends clause is provided, then the interface being declared extends each of the specified interface types and therefore inherits the member classes, member interfaces, instance methods, and static fields of each of those interface types.

(强调我的。)

所以是的,我很确定这是继承。

也许要举一个继承的例子,我们应该指出来自 CrudRepository 的东西被 UserRepository 继承。