首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于Scala中的视图的问题

关于Scala中的视图的问题
EN

Stack Overflow用户
提问于 2011-04-03 05:35:56
回答 2查看 812关注 0票数 3

我看到了一些示例,其中转换函数T => S作为隐式参数传递。Scala calls这个函数view,甚至为这种情况提供了特殊的语法-- view bound

然而,我们已经有了隐式转换!我可以用隐式转换替换这些views (即作为隐式参数传递的转换函数)吗?我可以用views做什么,我不能用隐式转换做什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-03 05:54:04

我对你的问题的理解是,

代码语言:javascript
运行
复制
case class Num(i: Int)
implicit def intToNum(i: Int) = Num(i)

def test[A <% Num](a: A): Int = a.i
test(33)

结束

代码语言:javascript
运行
复制
def test2(a: Num): Int = a.i
test2(33)

是?视图的含义就是:类型T可以被看作是另一个类型S。你的方法或函数可能首先想要处理T。下面是一个排序示例:

代码语言:javascript
运行
复制
def sort[A <% Ordered[A]](x: A, y: A): (A, A) = if (x < y) (x, y) else (y, x)

sort(1, 2)     // --> (1,2)
sort("B", "A") // --> (A,B)

视图边界的另外两个用例:

  • 你可能只想在某些情况下从T转换为S,例如
  • (这在某种程度上和上面的情况是一样的:你基本上想要使用T)你可能想要链接隐式转换。请看这篇文章:How can I chain implicits in Scala?
票数 9
EN

Stack Overflow用户

发布于 2011-04-03 07:00:37

您所说的隐式转换只不过是全局范围内的一个视图。

在使用类型参数时,视图边界是必需的,因为它表示需要进行隐式转换。例如:

代码语言:javascript
运行
复制
def max[T](a: T, b: T): T = if (a < b) b else a

因为对T没有任何约束,所以编译器不知道<方法是否可用。让我们看看编译器允许你这样做,然后考虑这两个调用:

代码语言:javascript
运行
复制
max(1, 2)
max(true, false)

签名max[T](a: T, b: T): T中没有任何东西告诉编译器不应该允许第二次调用,而应该允许第一次调用。这就是视图边界的用武之地:

代码语言:javascript
运行
复制
def max[T <% Ordered[T]](a: T, b: T): T = if (a < b) b else a

这不仅告诉编译器<方法来自哪里,而且还告诉编译器max(true, false)是无效的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5526048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档