大数据Saprk----Spark基础-scala的隐式转换

first Codec

**public class Friend {
	public static void main(String[] args){
		System.out.println("BigData加QQ群:947967114");
	}
}**

1、隐式转换
通常在处理两个开发时完全不知道对方才能在的软件或类型库时非常有用,他们各自都有自己的方式描述某个概念,而这个概念本质上是描述同一件事。隐式转换可以减少一个类型显示转换成另一个类型的需要。
2、隐式转换规则
隐式定义指可以允许编译器插入程序解决类型错误的定义。比如如果a+b是不能编译,那么编译器会把它改成convert(a)+b的形式,其中convert就是某种转换。如果经过convert修复能够支持+这个动作,就说这个程序是可以修复的。
标记规则:只有标记为implicit定义才可用。,关键字implicit用来标记哪些声明可以被编译器用作隐式定义。可以用implicit来标记任何变量、函数或对象定义。下面有一个隐式函数定义:
implicit def intToString(x:Int):String=x.toString
scala指挥考虑那些在作用域内的隐式转换。所以必须把隐式转换定义引入到当前作用域才可用。

我们把隐式转换说的简单一点,每当编译器看到A类型而它需要的是B类型,编译器就会查找一个能把A转换到B的隐式转换。
例如双精度浮点型不能被用作整数。因为会丢失精度。
scala> val ini:Int=3.14
:15: error: type mismatch;
found : Double(3.14)
required: Int
val ini:Int=3.14
^
如果想让他通过,我们可以写一个隐式转换。
scala> implicit def doubleToInt(a:Double):Int=a.toInt
warning: there was one feature warning; re-run with -feature for details
doubleToInt: (a: Double)Int
这个转换已经成功但是编译器告诉我们一个警告。首先应用隐式转换
scala> val i:Int=3.14
i: Int = 3
现在我们的编译能够正常通过。编译器查找到一个double类型,也就是3.14.但是这里需要的是一个Int,这是一个类型的错误,但是编译器在放弃之前会查找一个从Double到Int的隐式转换。他找到了我们定义的doubleToInt。进行了类型转换,编程了Int也就是3。
那么val i:Int=3.14被编程了val i:Int=doubleToInt(3.14)
这里我们并没有要求进行这样的转换。而是通过把doubleToInt作为标记符纳入到作用域,将他标记为可用的隐式转换。这样编译器就会在需要Double转换成Int时自动使用。
这里我们应该注意到以上的那个警告,警告是在提醒我们应用这个隐式转换会有风险,这里的风险就是精度丢失的问题。Double类型转换成Int会丢失数据的精度。这在程序编写中是不允许的。如果是Int向Double类型转换则是更讲的通。scala就是这么应用的。scala程序引入的对象都定义了那些从小的数值类型向更大的数值类型的隐式转换。例如scala的Predef有如下的转换的定:
implicit def Byte2byte(x: java.lang.Byte): Byte = x.byteValue
implicit def Short2short(x: java.lang.Short): Short= x.shortValue
implicit def Cha

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值