是否有理由在Scala中使用子类型作为类型参数?
发布时间:2020-12-16 18:53:46 所属栏目:安全 来源:网络整理
导读:我想知道是否有充分的理由使用子类型作为函数类型参数? 让我们考虑以下示例: scala trait Animal { def sound: String }defined trait Animalscala def f1[T : Animal](a: T) = a.soundf1: [T : Animal](a: T)Stringscala def f2(a: Animal) = a.soundf2:
我想知道是否有充分的理由使用子类型作为函数类型参数?
让我们考虑以下示例: scala> trait Animal { def sound: String } defined trait Animal scala> def f1[T <: Animal](a: T) = a.sound f1: [T <: Animal](a: T)String scala> def f2(a: Animal) = a.sound f2: (a: Animal)String f1比f2有一些优势吗? 解决方法
我相信你的例子没有任何优势.类型参数通常用于连接代码的不同部分,但有关T的信息实际上会丢失,因为它与任何内容都不匹配.考虑另一个例子:
def f1[T <: Animal](a: T) = (a.sound,a) def f2(a: Animal) = (a.sound,a) 现在情况有所不同,因为T被传递给返回类型: class Dog extends Animal { def sound = "bow-wow" } f1(new Dog) //> (String,Dog) = (bow-wow,Dog@141851fd) f2(new Dog) //> (String,Animal) = (bow-wow,Dog@5a1fe991) 在这种情况下,您可以将f1视为在编译时“实例化”的模板,并基于编译时参数类型有效地生成特定方法.因此,如果你想使用f1(new Dog),其中需要(String,Dog)它将编译,而f2(new Dog)则不会. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |