加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

是否有理由在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)则不会.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读