Given:
class Foo[T] {
def get: T
}
class Bar
class FooBar extends Foo[Bar] {
def get = new Bar
}
object Baz {
def something [T, U <: Foo[T]] (foo : Class[U]): T = foo.newInstance.get
}
我应该能够做这样的事情,对吧?
Baz.something(classOf[FooBar])
奇怪的是,这是抛出:
inferred type arguments [Nothing,this.FooBar] do not conform to method something's type parameter bounds [T,U <: this.Foo[T]]
这很奇怪:S。顺便说一句,我在迁移一些 java 代码时遇到了这个问题,这些代码与我在这里编写的代码相同,并且工作正常。
您遇到了 Scala 类型推断的更烦人的限制之一!看这个答案 https://stackoverflow.com/a/10347307清楚地解释编译器为何在这里窒息。
你有几个选择。最简单的是,您可以自己提供类型:
Baz.something[Bar, FooBar](classOf[FooBar])
但这是令人恼火的冗长。如果你真的不在乎U
,您可以将其保留在类型参数列表之外:
object Baz {
def something[T](foo: Class[_ <: Foo[T]]): T = foo.newInstance.get
}
Now FooBar
将在您的示例中正确推断。您还可以使用上面链接的答案中讨论的技巧:
object Baz {
def something[T, U <% Foo[T]](foo: Class[U]): T = foo.newInstance.get
}
Why这个工作有点棘手——关键是在视图绑定脱糖之后,T
不再出现在U
的绑定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)