Scala 为具有构造函数的类型创建扩展方法时,是否需要类型约束?

Scala 为具有构造函数的类型创建扩展方法时,是否需要类型约束?,scala,Scala,假设我有这样一种类型: case class Product(value: String) 我有一个用于这个case类的构造函数,它返回 Either(String, Option[Product]) 现在我想创建一个扩展方法,它将基本上模拟具有相同模式的所有类型的这种行为 val leftMessage = "leftMessage" val product: Option[Product] = Some("sku123") match { c

假设我有这样一种类型:

case class Product(value: String)
我有一个用于这个case类的构造函数,它返回

Either(String, Option[Product])
现在我想创建一个扩展方法,它将基本上模拟具有相同模式的所有类型的这种行为

val leftMessage = "leftMessage"
val product: Option[Product] = Some("sku123") match {
   case Some(sku) => Right(Product(sku))
   case None =>
     Left(rightMessage)
}
因此,在尝试创建扩展方法时,我尝试了以下方法:

class SomeOps[T](either: Either[String, T]) {
   def toSomething(value: Option[String], leftMessage: String): Either[String, Option[T] = value match {
      case Some(v) => T.apply(v) match {
         case Right(r) => Some(r)
         case _ => Left(leftMessage)
      }
      case None => Right(None)
}
这不起作用,因为我需要以某种方式设置一个约束,使我的类型
t
有一个构造函数,它接受我相信的字符串


有没有一种方法可以使用扩展方法来抽象这种行为?

路易斯的评论是正确的。您确实需要一个typeclass来完成此操作。通过使用typeclass,您可以概括“需要有一个构造函数”,然后为您需要的任何类型提供实例。它看起来是这样的:

案例类产品(值:字符串)
trait FromString[T]{
def parse(s:String,errorMessage:String):或[String,T]
}
来自StringInstances的对象{
隐式对象ProductFromString扩展自字符串[Product]{
def parse(s:String,errorMessage:String)=右(产品)
}
}
对象扩展{
隐式类SomeOps(val s:String)扩展了AnyVal{
def parseString[T:FromString](错误消息:String):或者[String,T]={
隐式[FromString[T]]。解析(s,errorMessage)
}
}
}
对象Hello扩展应用程序{
导入扩展_
从StringInstances导入_
val p:or[String,Product]=“123”。解析字符串(“错误”)
}

PS:我删除了
选项
以使其更易于阅读,但添加它应该不是一个主要问题

使用typeclass。case类在一个库中,我无法控制@LuisMiguelMejíaSuárezSo什么?TypeClass的一个要点是能够扩展第三方类型。看一看和。