在Scala特征/抽象类中引用未实现的成员

时间:2018-07-29 12:40:38

标签: scala

我被这样的情况咬了很多遍:

INSERT INTO [dbo].[TEP_ReceiptID] ([ReceiptID]) Values (UCase(Left(Application.username, 1) & Right(Application.username, 1)) & cast(cast(rand()*99 as int) as varchar(2)))

在此示例中,所有内容都进行了编译,但最后一行在运行时引发了NullPointerException,(我认为)是因为trait MyTrait { val implementMe: String val upper = implementMe.toUpperCase } class MyClass(s: String) extends MyTrait { override val implementMe: String = s } val c = new MyClass("Hello, World") println(c.upper) 是在实际定义upper之前计算出来的。

我知道我可以通过将implementMe更改为upperdef来解决它,但是似乎应该在编译时而不是运行时捕获它。我做错了什么/在编译时是否可以检测到此类问题?编译器允许这样做吗?

1 个答案:

答案 0 :(得分:0)

问题是初始化,正如您所说。据我所知,没有办法在编译时检测到这一点。有一个技巧叫早期初始化,它使您可以避免deflazy val(如果这是您的目标)的同时解决此问题:

class MyClass(s: String) extends { override val implementMe: String = s } with MyTrait