【问题标题】:Type ranges in type member refinement类型成员细化中的类型范围
【发布时间】:2019-03-17 16:54:59
【问题描述】:
class Animal
class Cat extends Animal

trait ZPar {
  type K
  def get(i: K)
}

def zz(t:ZPar{ type K >: Animal } ) = {
   t.get(new Cat) //compiled! why?
}

这段代码编译没有错误,但我认为一定有问题,因为K >: Animal 并且我传递了Cat,这绝对不是Animal 的超类型。

是编译器有问题还是我误解了这个概念?

【问题讨论】:

    标签: scala types


    【解决方案1】:

    t.get 的参数必须具有 t.K 类型。编译器并不确切知道它是什么类型,但它确实知道它是Animal 的超类型,因此也是Cat 的超类型。所以Cat 类型的任何值也有t.K 类型。

    【讨论】:

      【解决方案2】:

      new Cat 不必是 Cat 类型。 new Cat 不仅可以是 Cat 类型。它可以是CatAnimalAnyRefAny 类型。

      所以这里K 被推断为可能的最小类型,即Animal

      【讨论】:

      • 一个小分歧:它必要的,它不是new Cat 的唯一类型。少一点:K 不会被推断为任何东西。
      猜你喜欢
      • 2018-02-01
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      相关资源
      最近更新 更多