Skip to content

Instantly share code, notes, and snippets.

@jmccance
Last active January 12, 2016 18:06
Show Gist options
  • Save jmccance/deaff5f642d91bd966e4 to your computer and use it in GitHub Desktop.
Save jmccance/deaff5f642d91bd966e4 to your computer and use it in GitHub Desktop.
Abstract overrides
trait Greeting {
def greeting: String
}
trait Greeter {
this: Greeting =>
def greet() = greeting
}
trait GreetingDecorator extends Greeting {
abstract override lazy val greeting = super.greeting + ", you insensitive clod"
}
trait DefEnglishGreeting extends Greeting {
def greeting = "Hello"
}
trait ValEnglishGreeting extends Greeting {
val greeting = "Hello"
}
trait LazyValEnglishGreeting extends Greeting {
lazy val greeting = "Hello"
}
// trait SubclassedEnglishGreeting extends LazyValEnglishGreeting {
// override def greeting = super.greeting + ", you insensitive clod"
// }
// Error:(28, 34) super may not be used on lazy value greeting
// override def greeting = super.greeting + ", you insensitive clod"
// ^
object DefEnglishGreeter extends Greeter with DefEnglishGreeting with GreetingDecorator
// object ValEnglishGreeter extends Greeter with ValEnglishGreeting with GreetingDecorator
// overriding value greeting in trait ValEnglishGreeting of type String;
// lazy value greeting in trait GreetingDecorator of type String cannot override a concrete non-lazy value
// object ValEnglishGreeter extends Greeter with ValEnglishGreeting with GreetingDecorator
// ^
object LazyValEnglishGreeter extends Greeter with LazyValEnglishGreeting with GreetingDecorator
DefEnglishGreeter.greet()
LazyValEnglishGreeter.greet()
// java.lang.StackOverflowError
// at com.foo.common.config.archaius.A$A90$A$A90$LazyValEnglishGreeter$.com$foo$common$config$archaius$A$A90$A$A90$GreetingDecorator$$super$greeting(wks.sc0.tmp:35)
// at com.foo.common.config.archaius.A$A90$A$A90$GreetingDecorator$class.greeting(wks.sc0.tmp:12)
// at com.foo.common.config.archaius.A$A90$A$A90$LazyValEnglishGreeter$.greeting$lzycompute(wks.sc0.tmp:35)
// at com.foo.common.config.archaius.A$A90$A$A90$LazyValEnglishGreeter$.greeting(wks.sc0.tmp:35)
// at com.foo.common.config.archaius.A$A90$A$A90$LazyValEnglishGreeter$.com$foo$common$config$archaius$A$A90$A$A90$GreetingDecorator$$super$greeting(wks.sc0.tmp:35)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment