Hei*_*nzi 5 types scala overloading type-erasure
我有一个案例类,以Seq [T]作为参数:
case class MyClass(value: Seq[T])
Run Code Online (Sandbox Code Playgroud)
我现在希望能够写作
MyClass(t1,t2,t3)
Run Code Online (Sandbox Code Playgroud)
所以我定义了
object MyClass {
def apply(value: T*) = new MyClass(value.toSeq)
}
Run Code Online (Sandbox Code Playgroud)
它不起作用,因为case类定义了
object MyClass {
def apply(value: Seq[T])
}
Run Code Online (Sandbox Code Playgroud)
并且擦除后Seq [T]和T*具有相同的类型,因此我不能使它们超载.
但是我想允许两种访问方式.应该允许两种方式:
MyClass(t1,t2,t3)
MyClass(some_seq_of_T)
Run Code Online (Sandbox Code Playgroud)
由于Seq [T]和T*几乎是相同类型(至少在擦除之后;并且在具有参数T*的函数内部变为Seq [T]),我认为应该有一种方法允许两种方式调用它.
在那儿?
你可以欺骗一点,然后像这样定义你的同伴:
case class MyClass[T](value: Seq[T])
object MyClass {
def apply[T](first: T, theRest: T*) = new MyClass(first :: theRest.toList)
def apply[T]() = new MyClass[T](Nil)
}
Run Code Online (Sandbox Code Playgroud)
只要至少有一个参数,第一个apply处理MyClass(1,2,3).scond apply处理0参数的情况.它们与常规构造函数不冲突.
这样,你可以写MyClass(Seq(1,2,3)),MyClass(1,2,3)和MyClass().请注意,对于空的,你必须告诉它要返回什么类型,否则它会假设一个MyClass[Nothing]
| 归档时间: |
|
| 查看次数: |
265 次 |
| 最近记录: |