由于编译器可以轻松区分Java中的class
和interface
,为什么要提供显式关键字extends
和implements
并为代码添加详细程度?例如:
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更喜欢清洁而不是冗长(例如。;
是可选的),它也可以区分class
,interface
和trait
。为什么它也遵循Java在这方面的道路?
答案 0 :(得分:5)
他们当然可以,但是Java在语言方面总是比C#更加冗长。
从Java代码中你可以读到 extends 或 implements ,在C#中你必须依赖命名转换来查看它是否扩展或实现。我喜欢Java的表现力,尽管我从早期的.NET开始就是C#开发人员。
答案 1 :(得分:2)
我想使用extends
和implements
指出代码的可读性。
正如您提到的 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