【问题标题】:scala lower bound should allow same hierarchy Objects?scala下限应该允许相同的层次结构对象吗?
【发布时间】:2016-11-02 17:02:15
【问题描述】:

我刚开始使用 Scala,想了解一些基础知识。在下面的函数中,Lower bound 设置为 Puppy。为什么下面代码中允许使用 Puppy1 和 Puppy2。

class Animal
class Dog extends Animal
class Puppy extends Animal
class Puppy1 extends Animal
class Puppy2 extends Puppy

class AnimalCarer{
    def display [T >: Puppy](t: T){
    println(t)
    }
}

val animal = new Animal
val dog = new Dog
val puppy = new Puppy
val puppy1 = new Puppy1
val puppy2 = new Puppy2

val animalCarer = new AnimalCarer
animalCarer.display(animal)
animalCarer.display(puppy)
animalCarer.display(puppy1)
animalCarer.display(puppy2)
animalCarer.display(dog)

【问题讨论】:

  • 我在 T 里面填满了 Object
  • 如果可以的话,编译器向上转换为适合边界的类型。

标签: scala lower-bound


【解决方案1】:

这是 Scala 类型推断与常见概念(直觉)相混淆的经典示例。

def foo[T >: Puppy](t: T) = t

foo(new Puppy1) //compiles

foo[Puppy1](new Puppy1) //give compilation error

Scala REPL

scala> def foo[T >: Puppy](t: T) = t
foo: [T >: Puppy](t: T)T

scala> foo(new Puppy1)
res9: Animal = Puppy1@4d49af10

scala> foo[Puppy1](new Puppy1)
<console>:16: error: type arguments [Puppy1] do not conform to method foo's type parameter bounds [T >: Puppy]
       foo[Puppy1](new Puppy1)
      ^

【讨论】:

    【解决方案2】:

    由于您没有明确填写 T,编译器会尝试使用正确的类型为您推断它以进行编译:

    animalCarer.display[testing.ParamTest.Animal](ParamTest.this.puppy1);
    animalCarer.display[testing.ParamTest.Puppy](ParamTest.this.puppy2);
    animalCarer.display[testing.ParamTest.Animal](ParamTest.this.dog)
    

    这是 Scala 的Local Type Inference 算法的一部分。如您所见,每个方法调用都被推断为正确的T,例如puppy1: Animal,它遵守下限约束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      相关资源
      最近更新 更多