1

Function[K=>V, K=>V]関数を受け取り、指定されたK=>V関数の型を返す高階関数が欲しいのですが。たとえば、次のように動作させたいと思います。

  class Foo[K, V]() {
    def apply[K1 <: K, V1 <: V](f: K1 => V1) = f
  }

  // dummy class hierachy
  class A
  class B extends A
  class C extends B

    // a function f: B=>B
  def f(some: B): B = some

  // the desired result
  val result1: B => B = new Foo[A, A]()(f)

のapplyメソッドは、をFoo取り、B=>Bを返しますB=>B。type-parametersKV「最高」の型を追跡Fooすることは、引数として取ることができます。Fooさて、次のように関数を拡張したいと思います

  class Bar[K, V] extends Function[K=>V, K=>V]() {
    def apply(f: K => V) = f
  }

  val result2: B => B = new Bar[A, A]()(f)

ただし、これは明らかに機能しません。これを機能させる方法はありますか?ありがとう

編集

  class Fuzz[K, V, K1 <: K, V1 <: V] extends Function[K1=>V1, K1=>V1] {
    def apply(f: K1 => V1) = f
  }

  val result3: B => B = new Fuzz[A, A, B, B]()(f) 

また動作しますが、2つの追加のタイプパラメータを持ちたくない

4

1 に答える 1

2

A => Aはのサブタイプではないため(またスーパータイプでもないため) 、これは機能できず、機能しないはずB => Bです。その理由は、Function1は引数の型が共変であり、結果の型が反変であるためです。したがってA => A、のサブタイプであるためにはB => B、のスーパータイプであると同時にAサブタイプである必要があります。これは、とが実際に同じタイプである場合にのみ当てはまります。分散のより詳細な説明については、Scalaのツアーを参照してください。BAB

于 2012-12-31T17:05:16.653 に答える