Java 从scala中的trait扩展的属性出错
我正在使用scala,我有一个带有属性“name”的trait,我在Userclass中扩展了这个trait,在这里我正在访问该属性Java 从scala中的trait扩展的属性出错,java,scala,Java,Scala,我正在使用scala,我有一个带有属性“name”的trait,我在Userclass中扩展了这个trait,在这里我正在访问该属性 当我试图用这样的特征来声明名称时 val name : String 它在子类中给出错误,该子类是未实现的成员 但是当我试着 val name : String = "" 它只是工作得很好 请告诉我区别和原因,为什么它以前不工作,为什么它在修改后工作我假设您的代码如下所示: trait hasName { val name : String } clas
当我试图用这样的特征来声明名称时
val name : String
它在子类中给出错误,该子类是未实现的成员
但是当我试着
val name : String = ""
它只是工作得很好
请告诉我区别和原因,为什么它以前不工作,为什么它在修改后工作我假设您的代码如下所示:
trait hasName {
val name : String
}
class Person extends hasName
特性本质上是抽象的,这意味着它允许有未实现的方法。实际上,trait
所声明的是:
所有扩展hasName
的类都保证有一个val name:String
实例变量。变量中的内容取决于实际的子类
在上述情况下,您的代码扩展为:
trait hasName {
val name : String = ???
}
其中?
本质上意味着特定的“功能”未实现
修改后:
trait hasName {
val name : String
}
class Person extends hasName {val name : String = ""}
扩展类Person
用自己的实现重写hasName
trait的实现,或者在本例中,重写hasNametrait的实现
或者,如果您这样做:
trait hasName {
val name : String = ""
}
您正在将一个实现添加到
hasName
,因此默认情况下,每个子类都将具有该实现。为什么将val与className一起使用?你可以使用val name='Joe'和name will String来输入,你应该使用vard。也许你应该显示实际的trait和扩展类。如果你没有在trait中提供name
的实现,那么你实际上必须在UserClass
中提供的实现。请告诉我当我使用这两种方法时,内存中发生了什么?为什么第一种方法不起作用?它不是指内存中的任何东西吗?事实上,在这种情况下,内存中没有发生任何事情。在编译时,扩展hasName
表示您的用户类将有一个val name:String
的实现,但是编译器找不到这样的实现,因此不会编译。