首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减少导致编译时错误的字符串?

减少导致编译时错误的字符串?
EN

Stack Overflow用户
提问于 2014-01-09 10:36:49
回答 3查看 117关注 0票数 0

将Int还原为单个Int很好:

代码语言:javascript
复制
val input = List(3, 5, 7, 11)
def op(total: Int, cur: Int) = total + cur//> op: (total: Int, cur: Int)Int
input reduce op   

但是当我尝试连接字符串时:

代码语言:javascript
复制
def op(total: String, cur: String) = (total + cur) //> op: (total: Int, cur: Int)Int
val input = List(3, 5, 7, 11)    
input reduce op

导致编译器错误:类型不匹配;找到:(字符串,字符串)需要的=>字符串:(任意,任何) => Any

字符串不是类型的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-09 11:03:42

根本原因

您有一个函数,接受String并重放String,然后尝试用整数填充它。您需要从字符串到整数的某种转换(显式或隐式)。

错误信息

编译器知道,为reduce提供的函数必须接受一个值为一个类型(两个元素的类型相同)的对,并返回一个相同类型的值。当输入整数和期望字符串时,此类型只能是任意类型。

但是您的函数是(String, String) => String类型的。这不能映射到(Any, Any) => Any。返回值不是问题,因为字符串总是可以被抛出给任何一个。但是这个参数是个问题:并不是每一个任何一个都可以被抛到一个字符串中。

解决方案

将您的值转换为字符串。

代码语言:javascript
复制
val input = List(3, 5, 7, 11).map(_.toString)

或添加隐式转换函数。

代码语言:javascript
复制
implicit def lint2lstr : List[Int] => List[String] = _.map(_.toString)

然后,编译器将在您定义

代码语言:javascript
复制
val input : List[String] = List(3, 5, 7, 11)
票数 1
EN

Stack Overflow用户

发布于 2014-01-09 10:42:39

不能将input集合(Ints)的元素传递给接受Strings的函数。

请参见reduce方法的声明:

代码语言:javascript
复制
def reduce[A1 >: A](op: (A1, A1) => A1): A1

A这里是元素的类型(在您的例子中,AInt)。

A1应该是A的超级类型。

AnyInt的超级类型,但String不是Int的超级类型。

实际上,编译器错误并不完全正确,需要任何函数(A1, A1) => A1,例如A1A的超级类型(在您的例子中,AInt)。

还请注意,(String, String) => String不是(Any, Any) => Any的子类型,因此不能在需要(Any, Any) => Any的地方使用(String, String) => String

票数 1
EN

Stack Overflow用户

发布于 2014-01-09 10:53:38

这里的inputList[Int]类型的

列表的reduce方法有以下声明

代码语言:javascript
复制
def reduce[A1 >: A](op: (A1, A1) => A1): A1

基本上,这意味着reduce用于List[A]接受(A1, A1) => A1类型的运算符,并返回A1类型,其中A1A的超级类型。在您的例子中,A1必须是Int或它的超级类型。

这是因为reduce工作是通过在项上连续应用操作符来完成的。即。前两项的运算符的结果与下一项一起使用。这意味着操作符函数声明应该使相同的函数能够接受它产生的结果以及列表中的项。

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

https://stackoverflow.com/questions/21017821

复制
相关文章

相似问题

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