相关疑难解决方法(0)

case类复制'方法'与超类

我想做这样的事情:

sealed abstract class Base(val myparam:String)

case class Foo(override val myparam:String) extends Base(myparam)
case class Bar(override val myparam:String) extends Base(myparam)

def getIt( a:Base ) = a.copy(myparam="changed")
Run Code Online (Sandbox Code Playgroud)

我不能,因为在getIt的上下文中,我没有告诉编译器每个Base都有一个'copy'方法,但copy也不是一个真正的方法所以我不认为有特征或抽象方法我可以放入Base以使其正常工作.或者,有吗?

如果我尝试将Base定义为abstract class Base{ def copy(myparam:String):Base },则case class Foo(myparam:String) extends Base结果为class Foo needs to be abstract, since method copy in class Base of type (myparam: String)Base is not defined

是否有其他方法告诉编译器所有Base类在其实现中都是case类?一些特征意味着"具有案例类的属性"?

我可以让Base成为一个案例类,但后来我得到编译器警告,说不推荐使用case类继承吗?

我知道我也可以:

def getIt(f:Base)={ 
  (f.getClass.getConstructors.head).newInstance("yeah").asInstanceOf[Base]
}
Run Code Online (Sandbox Code Playgroud)

但是......这看起来很难看.

思考?我的整个方法是"错误的"吗?

更新我更改了基类以包含属性,并使案例类使用"override"关键字.这更好地反映了实际问题,并考虑到Edmondo1984的响应使问题更加真实.

inheritance enumeration scala class

26
推荐指数
3
解决办法
1万
查看次数

如何使用Scala宏在方法调用中为命名参数建模?

在某些用例中,创建对象的副本很有用,该对象是一组案例类的案例类的实例,它们具有共同的特定值.

例如,让我们考虑以下案例类:

case class Foo(id: Option[Int])
case class Bar(arg0: String, id: Option[Int])
case class Baz(arg0: Int, id: Option[Int], arg2: String)
Run Code Online (Sandbox Code Playgroud)

然后copy可以在每个案例类实例上调用:

val newId = Some(1)

Foo(None).copy(id = newId)
Bar("bar", None).copy(id = newId)
Baz(42, None, "baz").copy(id = newId)
Run Code Online (Sandbox Code Playgroud)

如此处和此处所述,没有简单的方法来像这样抽象:

type Copyable[T] = { def copy(id: Option[Int]): T }

// THIS DOES *NOT* WORK FOR CASE CLASSES
def withId[T <: Copyable[T]](obj: T, newId: Option[Int]): T =
  obj.copy(id = newId)
Run Code Online (Sandbox Code Playgroud)

所以我创建了一个scala宏,它完成了这项工作(几乎):

import scala.reflect.macros.Context

object Entity {

  import …
Run Code Online (Sandbox Code Playgroud)

scala scala-macros

23
推荐指数
1
解决办法
3318
查看次数

标签 统计

scala ×2

class ×1

enumeration ×1

inheritance ×1

scala-macros ×1