問題を短い言葉で説明するのは難しいので、問題を提示するためのコードの写真を用意しました。
Container[T1,T2]
そのコンテナー内の任意の値をラップするための型と暗黙のコンテナーを開発しましょう。値が Container[T1,T2]
ラッピングのタイプである場合、同じタイプを返す必要があります。さらに、オーバー ラッピング メソッドは、タイプ T1 (コンテナーと同じ) のパラメーターを取得する必要があり、その結果、T1 値が置き換えられたコンテナーが生成されます。ソリューションは、ジェネリックと暗黙の方法に準拠する必要があります。
少し混乱するように聞こえますが、コードを読んでみましょう :)
容器:
case class Container[T1, T2](t1: T1, t2: T2)
ラッピング方法による特性:
trait ToContainer[A] { def wrappingMethod[E](e: E): Container[E, A] }
暗黙的なオブジェクト:
object ToContainers { import language.implicitConversions implicit def implicitMethod[A](a: => A) = new ToContainer[A] { def wrappingMethod[E](e: E): Container[E, A] = Container(e, a) } implicit def implicitMethod2[E, A] (c: => Container[E, A])(implicit d:DummyImplicit): ToContainer[A] = new ToContainer[A] { def wrappingMethod[EX](e: EX): Container[EX, A] = c.copy(e) } }
それがコードでした。
EX
問題は、関数の型パラメーターを のdef wrappingMethod[EX]
パラメーターに何らかの形でバインドする必要があることE
ですdef implicitMethod2[E, A]
。
この後、次のようなものが機能するはずです(そして機能します):
scala> import ToContainers._
import ToContainers._
scala> val c1: Container[String, Int] = 1234.wrappingMethod("abc")
c1: Container[String,Int] = Container(abc,1234)
scala> val c2: Container[String, Int] = c1.wrappingMethod("XXX")
c2: Container[String,Int] = Container(XXX,1234)
...しかし、これはコンパイルエラーを発生させる必要があり、そうしないでください:((型を見てください:c1には[String、Int]があり、c3には[Int、Int]があります。これを防ぎたいです。)
scala> val c3 = c1.wrappingMethod(0)
c3: Container[Int,Int] = Container(0,1234)
どんなアイデアでも大歓迎です:)
ところで:私はこのバージョンのscalaを使用しています:
Scala バージョン 2.10.0-M7 (Java HotSpot(TM) 64 ビット サーバー VM、Java 1.7.0_07) へようこそ
編集:
エラーを修正しました。コードは現在機能しています。