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

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

蔺山
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请求,但我得到了一个标题错误。有人知道这是什么原因吗?因为在我的其他应用程序中,这工作得非常好?

  • 问题内容: 我有一个方法以a 作为参数。 在中,我如何知道a 是还是a 是? 问题答案: 根据用户omain的回答“如果使用<?>,则意味着您将不会在任何地方使用参数化类型。要么转到特定类型(在您的情况下,似乎是),要么转到非常通用的“ 另外,我相信如果您使用问号,编译器将在运行时(类型;有效Java的第119页)消除类型不匹配的情况,绕过擦除,并有效地消除了使用泛型类型所带来的好处? 要回答发问