gpt4 book ai didi

Scala:为什么不能编译?

转载 作者:行者123 更新时间:2023-12-04 17:11:10 25 4
gpt4 key购买 nike

鉴于:

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 类型推断的更烦人的限制之一!见 this answer清楚地解释为什么编译器在这里窒息。

你有几个选择。最简单的是,您可以自己提供类型:

Baz.something[Bar, FooBar](classOf[FooBar])

但这太冗长了。如果你真的不在乎 U ,您可以将其排除在类型参数列表之外:
object Baz {
def something[T](foo: Class[_ <: Foo[T]]): T = foo.newInstance.get
}

现在 FooBar将在您的示例中正确推断。您还可以使用上面链接的答案中讨论的技巧:
object Baz {
def something[T, U <% Foo[T]](foo: Class[U]): T = foo.newInstance.get
}

为什么这个工作有点棘手——关键是在 View 绑定(bind)被脱糖后, T不再出现在 U 中的束缚。

关于Scala:为什么不能编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12961452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com