Scala 如何引用伴生对象';泛型类中的方法?
所以我对scala有点陌生 如何编写scala代码以通用方式引用case类的伴生对象中的方法?我尝试过几种不同的方法,但似乎找不到一种有效的方法 下面是一些有效的示例代码,但我必须手动构建每个子类 例如:Scala 如何引用伴生对象';泛型类中的方法?,scala,generics,Scala,Generics,所以我对scala有点陌生 如何编写scala代码以通用方式引用case类的伴生对象中的方法?我尝试过几种不同的方法,但似乎找不到一种有效的方法 下面是一些有效的示例代码,但我必须手动构建每个子类 例如: class One extends Act[LetterA] { val intro = LetterA.sayhi } 我更愿意做这样的事情: class AllOfThem[T <: LettersClass, S <: LettersSingleton] exten
class One extends Act[LetterA] {
val intro = LetterA.sayhi
}
我更愿意做这样的事情:
class AllOfThem[T <: LettersClass, S <: LettersSingleton] extends Act[T] {
val intro = S.sayhi
}
class-AllOfThem[T所以你不能完全做你想要做的事情,但是你可以非常接近常用的typeclass模式:
//add a type parameter, now you have a typeclass
trait LettersSingleton[T] {
def sayhi() : String
}
//LettersClass stays the same
object Implicits {
//implicit classes/objects have to go inside an object
//create typeclass instances as implicit objects
implicit object LetterASingleton extends LettersSingleton[LetterA] {
def sayhi = "Hi I am A"
}
implicit object LetterBSingleton extends LettersSingleton[LetterB] {
def sayhi = "Hi I am B"
}
}
import Implicits._
//add an implicit parameter to the class
abstract class Act[ T <: LettersClass ](implicit singleton: LettersSingleton[T]) {
def actionTwo() = {
println( singleton.sayhi )
}
}
(new Act[LetterA]).actionTwo() //prints "Hi I am A"
(new Act[LetterB]).actionTwo() //prints "Hi I am B"
实际上会变成
val a = new Act[LetterA](LetterASingleton)
您会注意到,单例不再是case类的伴生对象,这很好。您必须定义一个trait,因此无论是伴生对象还是实现它的其他对象,都没有多大区别
val a = new Act[LetterA]
val a = new Act[LetterA](LetterASingleton)