1

問題を短い言葉で説明するのは難しいので、問題を提示するためのコードの写真を用意しました。

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) へようこそ

編集:

エラーを修正しました。コードは現在機能しています。

4

2 に答える 2

2

提供したサンプルコードは機能しないため、適切な回答を提供するのは少し難しいです。ただし、次のようなことはできません。

implicit def implicitMethod2[E, A] (c: => Container[E, A])(implicit d:DummyImplicit): ToContainer[A] = new ToContainer[A] {
  def wrappingMethod[E](e: E): Container[EX, A] = c.copy(e)
}

EXしたがって、 typeパラメータを。に置き換えるだけEです。

于 2012-10-17T17:17:03.977 に答える
0

E型パラメータを次の値までToContainer移動する必要があります。

trait ToContainer[E, A]

  def wrappingMethod(e: E): Container[E, A]

}

object ToContainers {
  import language.implicitConversions

  implicit def implicitMethod[E, A](a: => A) = new ToContainer[E, A] {

    def wrappingMethod(e: E): Container[E, A] = Container(e, a)

  }

  implicit def implicitMethod2[E, A] (c: => Container[E, A])(implicit d:DummyImplicit): ToContainer[E, A] = new ToContainer[E, A] {

    def wrappingMethod(e: E): Container[E, A] = c.copy(e)

  }

}
于 2012-10-24T09:56:26.770 に答える