gpt4 book ai didi

Scala 下界的行为并不符合我的预期

转载 作者:行者123 更新时间:2023-12-03 04:49:53 26 4
gpt4 key购买 nike

今天我花了几个小时来理解 Scala 下界背后的逻辑,但我读得越多,就越感到困惑。您能解释一下吗?

这是我们研讨会的简单类层次结构:

class Animal
class Pet extends Animal
class Wild extends Animal

class Dog extends Pet
class Cat extends Pet

class Lion extends Wild
class Tiger extends Wild

所以层次结构会是这样的:

        Animal
/ \
Pet Wild
/ \ / \
Dog Cat Lion Tiger

这是客户端代码:

 object Main extends App {
//I expect the compilation of passing any type above Pet to fail
def upperBound[T <: Pet](t: T) = {println(t.getClass.getName)}

//I expect the compilation of passing any type below Pet to fail
def lowerBound[T >: Pet](t: T) = {println(t.getClass.getName)}

upperBound(new Dog)//Ok, As expected
upperBound(new Cat)//Ok, As expected
upperBound(new Pet)//Ok, As expected
//Won't compile (as expected) because Animal is not a sub-type of Pet
upperBound(new Animal)

lowerBound(new Pet)//Ok, As expected
lowerBound(new Animal)//Ok, As expected
//I expected this to fail because Dog is not a super type of Pet
lowerBound(new Dog)
//I expected this to fail because Lion is not a super type of Pet either
lowerBound(new Lion)
lowerBound(100)//Jesus! What's happening here?!
lowerBound(Nil)// Ok! I am out!!! :O
}

嗯...代码的最后四行对我来说没有任何意义!据我了解,下界根本不对类型参数施加任何约束。是否存在对我所缺少的 AnyAnyRef 的隐式绑定(bind)?

最佳答案

让我解释一下有界类型推断的意外行为

  1. Upper Bound(T <: Pet):这意味着 T 适用于至少继承了 Pet 类或 Pet 的任何子类的所有类。
  2. Lower Bound(T >: Pet):这意味着 T 适用于所有继承了至少一个 Pet 类的父类的类。

正如您所猜测的那样,AnyRef 是所有对象/引用类型的父类(super class)型。所以当我们说

lowerBound(new Dog())

Dog 属于 AnyRef 类。因此,根据下限,由于 AnyRef 是 Pet 的父级,因此编译器不会抛出警告。

您可以看到 scala List 类的 :: 方法有类似的行为。使用 List,您可以执行以下操作,而不会出现任何编译错误。

val list = List(1, 2, 3)

val newList = "Hello" :: list

要进一步阅读,请查看这些堆栈溢出答案:

  1. https://stackoverflow.com/a/19217523/4046067
  2. https://stackoverflow.com/a/19821995/4046067

关于Scala 下界的行为并不符合我的预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42885596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com