如何使用涉及泛型的匿名类型调用泛型方法?

时间:2010-05-11 19:02:38

标签: generics scala type-inference

我的代码有效:

  def testTypeSpecialization: String = {
    class Foo[T]

    def add[T](obj: Foo[T]): Foo[T] =  obj

    def addInt[X <% Foo[Int]](obj: X): X = { 
      add(obj)
      obj
    }

    val foo = addInt(new Foo[Int] {
      def someMethod: String = "Hello world"
    })

    foo.someMethod
  }

但是,我想这样写:

 def testTypeSpecialization: String = {
    class Foo[T]

    def add[X, T <% Foo[X](obj: T): T =  obj

    val foo = add(new Foo[Int] {
      def someMethod: String = "Hello world"
    })

    foo.someMethod
  }

第二个无法编译:

没有隐式参数匹配参数类型(Foo [Int] {...})=&gt; Foo [Nothing]被发现。

基本上:

  • 我想创建一个新的匿名者 动态的类/实例(例如新的 Foo [Int] {...}),并将其传递给 一个“添加”方法,将其添加到 列表,然后将其返回
  • 这里的关键是 来自“val foo =”的变量我想要 它的类型是匿名类, 不是Foo [Int],因为它增加了方法
    (本例中为someMethod)

有什么想法吗?

我认为第二个失败是因为Int类型正在被删除。我显然可以像这样'暗示'编译器:(这有效,但看起来像是黑客)

  def testTypeSpecialization = {
    class Foo[T]

    def add[X, T <% Foo[X]](dummy: X, obj: T): T =  obj

    val foo = add(2, new Foo[Int] {
      def someMethod: String = "Hello world"
    })

    foo.someMethod
  }

1 个答案:

答案 0 :(得分:1)

Dario建议在Foo中使用T协变:

def testTypeSpecialization: String = {
    class Foo[+T] {
      var _val: Option[T]
    } 

    def add[X, T <% Foo[X](obj: T): T =  obj

    val foo = add(new Foo[Int] {
      def someMethod: String = "Hello world"
    })

    foo.someMethod
  }

但是,这会给Foo增加太多限制,例如,我不能有一个类型为Option [T]的var成员变量。

协变类型T出现在setter val =

参数类型Option [T]中的逆变位置