5

Seq[T]をパラメーターとして使用するケースクラスがあります。

case class MyClass(value: Seq[T])

今、書けるようになりたい

MyClass(t1,t2,t3)

だから私は定義しました

object MyClass {
    def apply(value: T*) = new MyClass(value.toSeq)
}

ケースクラスが定義するため、機能しません

object MyClass {
    def apply(value: Seq[T])
}

消去後のSeq[T]とT*は同じタイプなので、オーバーロードすることはできません。

ただし、両方のアクセス方法を許可したいと思います。両方の方法を許可する必要があります。

MyClass(t1,t2,t3)
MyClass(some_seq_of_T)

Seq[T]とT*はほぼ同じタイプなので(少なくとも消去後、パラメーターT*を持つ関数の内部はSeq[T]になります)、両方の呼び出し方法を許可する方法があるはずです。 。

ある?

4

3 に答える 3

6

あなたは少しごまかして、このようにあなたの仲間を定義することができます:

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)
}

最初のものは、少なくとも1つの引数がある限り、をapply処理します。MyClass(1,2,3)scondapplyは0引数の場合を処理します。通常のコンストラクターと競合しません。

MyClass(Seq(1,2,3))このようにして、、、MyClass(1,2,3)およびを書くことができますMyClass()。空の場合は、返すタイプを指定する必要があることに注意してください。そうしないと、MyClass[Nothing]

于 2012-09-20T12:48:20.937 に答える
3

ケースクラスのないソリューションは次のとおりです。

scala> class A[T] (ts: Seq[T]) { def this(ts: T*)(implicit m: Manifest[T]) = this(ts) }
defined class A

scala> new A(1)
res0: A[Int] = A@2ce62a39

scala> new A(Seq(1))
res1: A[Seq[Int]] = A@68634baf
于 2012-09-20T13:01:09.437 に答える
0

同じ名前のメソッドが2つ存在することはできません。一方はタイプのパラメーターを取り、Seq[T]もう一方は。を取りますT*。コンパイラは、次のような呼び出しかどうかをどのように知るのでしょうか。

val s = Seq(1,2,3) 
foo(s)

最初のメソッドまたは2番目のメソッド(T = Intの場合)または2番目のメソッド(T = Seq [Int]の場合)を呼び出すことになっていますか?

于 2012-09-20T12:37:15.160 に答える