【发布时间】:2020-05-09 17:37:15
【问题描述】:
我试图理解为什么当我在 MyModel 中为 T 使用更高种类的类型参数时,以下代码无法编译
abstract class Model[M <: Model[M]]
class MyModel[T] extends Model[MyModel[T]]
class Bar[TModel <: Model[TModel]]
object Foo extends App {
new Bar[MyModel[_]]
}
但如果我将其更改为new Bar[MyModel[Any]],它将编译。这是为什么呢?
【问题讨论】:
-
它不必是
Any,你可以将它设为new Bar[MyModel[Int]],它会编译。我认为声明新对象时不能使用通配符,但我可能错了 -
这能回答你的问题吗? scala - Any vs underscore in generics
-
@user 通配符不能用于第一级,例如
new Some[_](???)(因为Some[_]不是类类型)但可以更深入地使用,例如new Some[Option[_]](???)(因为Some[T]是一个类类型,T=Option[_]是一个类型)。 -
@DmytroMitin 这很有趣。为什么
Option[_]有通配符时会被视为类型? -
@user 因为它是一种存在类型,即类型scala-lang.org/files/archive/spec/2.13/…
标签: scala generics existential-type f-bounded-polymorphism