Java 从scala中的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

我正在使用scala,我有一个带有属性“name”的trait,我在Userclass中扩展了这个trait,在这里我正在访问该属性
当我试图用这样的特征来声明名称时

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
的实现,但是编译器找不到这样的实现,因此不会编译。