Scala 如何引用伴生对象';泛型类中的方法?

Scala 如何引用伴生对象';泛型类中的方法?,scala,generics,Scala,Generics,所以我对scala有点陌生 如何编写scala代码以通用方式引用case类的伴生对象中的方法?我尝试过几种不同的方法,但似乎找不到一种有效的方法 下面是一些有效的示例代码,但我必须手动构建每个子类 例如: class One extends Act[LetterA] { val intro = LetterA.sayhi } 我更愿意做这样的事情: class AllOfThem[T <: LettersClass, S <: LettersSingleton] exten

所以我对scala有点陌生

如何编写scala代码以通用方式引用case类的伴生对象中的方法?我尝试过几种不同的方法,但似乎找不到一种有效的方法

下面是一些有效的示例代码,但我必须手动构建每个子类

例如:

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)