为什么我不能在Java中编写"implements AClass"?

Aiv*_*var 5 java compiler-construction jvm

在Java中,人们经常将类与类一起定义并尽可能使用接口名而不是类名,以便稍后允许新的实现.这里逻辑接口是重复的.

如果Java允许使用类作为接口,则不需要这种"以防万一"复制,例如:class MyScanner extends MyStuff implements java.util.Scanner.此外,这将缓解我需要提供类类型但我不想扩展该类的情况.

据我所知,"实现一个类"不仅会被编译器拒绝,也会被JVM拒绝(如果我将这个声明破解成类文件).对此有一些技术上的困难,还是不重要?它看起来不像是一个向后兼容问题(我的意思是,如果JVM支持这个问题,旧代码就可以正常运行).

编辑:为了澄清,我将在这里复制StriplingWarrior更好的相同问题的措辞:

为什么一个类不能实现另一个类的方法契约而不实际扩展该类?这是技术问题吗?是否会以某种方式向我们提出OP无法预见的一些问题?

Mic*_*rdt 9

我是否理解正确,MyClass implements AClass这意味着MyClass必须为所有公共方法提供(或继承)实现AClass?即每个类隐式定义一个由其公共方法组成的接口?

如果是这样,那么我看到的问题是接口实际上与类非常不同,并且两者不应该像那样混合.接口定义合同,对实现进行分类.结果是:类的功能可以相对自由地扩展,但不是与现有实现的接口.

因此,你有一个非常具体的理由说明你的建议是坏的:你永远不能将任何公共方法添加到任何类,而不会冒破坏implements该类的一些代码.

而另一方面,它会解决什么问题?当您具有单个实现的接口时代码重复?如何解决这个问题呢?IMO通常是由人们在使用过时的模拟框架而不能模仿具体类的情况下教条地做的事情.


Pla*_*ure 5

问题是多重继承.如果您尝试扩展或实现两个类,则存在潜在的语义问题.

您可以实现多个接口,也可以从一个类扩展.但是你只能通过强制规范本质上是声明性的,要求实现者直接实现这些方法来实现接口,这些接口可以解决多重继承的大部分问题.在这种情况下,方法冲突通过实现一个方法的简单方便并使其计入两个接口来解决.