当前位置: 首页 > 知识库问答 >
问题:

理解类型参数不符合类类型参数边界错误时使用更高类型类型参数

蔺山
2023-03-14

我试图理解为什么当我在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[_]]

}

但是如果我把它改成< code > new Bar[my model[Any]]它就会编译。这是为什么呢?

共有1个答案

衡建中
2023-03-14

< code>Bar[MyModel[_]]是< code > Bar[my model[X]for some { type X }]。

(它不应该与Bar[MyModel[X]]forSome {type X}Bar[MyModel[X forSome {type X}]]混淆,后者只是Bar[MyModel[Any]]。这是三种不同的类型。

Bar[MyModel[X] forSome {type X}] (aka Bar[MyModel[_]]) 無法編輯,因為 MyModel[X] forSome {type X} (又名 MyModel[_]) 不滿足 Bar 的條件 TModel

implicitly[(MyModel[X] forSome {type X}) <:< Model[MyModel[X] forSome {type X}]]

不编译(X 向左从

但是如果你做模型协变抽象类模型[ M

Bar[MyModel[Any]] 编译,因为 MyModel[Any] 满足 Bar 的条件 TModel

implicitly[MyModel[Any] <:< Model[MyModel[Any]]]

编译)。

 类似资料:
  • 一、泛型 Scala 支持类型参数化,使得我们能够编写泛型程序。 1.1 泛型类 Java 中使用 <> 符号来包含定义的类型参数,Scala 则使用 []。 class Pair[T, S](val first: T, val second: S) { override def toString: String = first + ":" + second } object ScalaAp

  • 我想使用泛型类作为另一个泛型类的类型参数。 起初,我对类的定义是这样的: 然后我的需求发生了变化,我不得不为我的R类型使用包装器/持有者类 到目前为止,我的尝试:(给出编译时错误:

  • 我刚刚更新到Dart2和Flatter sdk:' 无法将参数类型“Object”指定给参数类型“ImageProvider”。), 我只是从弗利特开始,不知道该去哪里找别的。

  • 由于最近的更新,我正面临这个问题,请伙计们帮帮我

  • 我试图用flutter插件HTTP发出HTTP POST请求,但我得到了一个标题错误。有人知道这是什么原因吗?因为在我的其他应用程序中,这工作得非常好?

  • 在了解Java泛型的过程中,我遇到了以下问题: 假设我有下面的方法来添加列表的元素,只限于包含数字的列表。 但是这段代码和这段代码有什么不同: 它们都按预期编译和执行。这两者之间有什么区别?除了语法之外?什么时候我更喜欢使用通配符而不是前者? 是的,使用通配符方法,我不能在列表中添加除null之外的新元素,否则它将无法编译。除此之外呢?