我有一个可行的代码:
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]{ ... }) => Foo[Nothing] 的隐式参数。
基本上来说:
- 我想临时创建一个新的匿名类/实例 (例如 new Foo[Int] { ... } ), 并将其传递给一个"add"方法,此方法将其添加到列表中,然后返回它
- 关键在于来自 "val foo = " 的变量, 我希望它的 类型 是匿名类,而不是Foo[Int],因为它添加了方法
(在这个例子中是someMethod)
有什么想法吗?
我认为第二个代码段失败是因为类型Int被擦除了。我可以通过这样的'提示'让编译器正常工作: (这个方法可行, 但似乎有点hack)
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
}
X
本应 没有被推导为Nothing
)... 试过使用class Foo[+T]
吗? - Dario