为什么Java / Scala使用扩展/实现关键字?

时间:2016-04-21 07:14:47

标签: java c# scala inheritance

由于编译器可以轻松区分Java中的classinterface,为什么要提供显式关键字extendsimplements并为代码添加详细程度?例如:

class Animal{}
interface FourLegged{}
class Dog : Animal, FourLegged {} // why can't we have this syntax in Java

我没有看到任何理由为什么Java在未来版本中不能破坏现有代码库的情况下不能提供类似C#的语法。有什么理由,请解释一下。

修改

很抱歉在两者之间编辑我的问题,但我的类似问题也适用于Scala。正如Patrick Hofman在下面指出的那样:

  

他们肯定可以,但Java总是更加冗长   他们的语言比C#。

对于Java,我同意他的看法。但我认为Scala更喜欢清洁而不是冗长(例如。;是可选的),它也可以区分classinterfacetrait。为什么它也遵循Java在这方面的道路?

3 个答案:

答案 0 :(得分:5)

他们当然可以,但是Java在语言方面总是比C#更加冗长。

从Java代码中你可以读到 extends implements ,在C#中你必须依赖命名转换来查看它是否扩展实现。我喜欢Java的表现力,尽管我从早期的.NET开始就是C#开发人员。

答案 1 :(得分:2)

我想使用extendsimplements指出代码的可读性。

正如您提到的 C#代码

class Dog : Animal, FourLegged {}

这里编译器会自己知道,但开发人员可能需要检查Animal/FourLegged类型的类型。

使用java代码

class Dog extends Animal implements FourLegged {}

很明显Animal是一个类(也可能是abstract类),其中可能存在默认实现。 FourLegged是一个用于实现多态的接口。

答案 2 :(得分:0)

实际上Scala并没有遵循Java。 Scala只有extends,并且with关键字用于组合要扩展的类型。

scala> trait Foo
defined trait Foo

scala> trait Bar
defined trait Bar

scala> class Baz extends Foo with Bar
defined class Baz