Scala隐式转换类遇到的问题

今天练习Scala的隐式转换类遇到的一个问题,测试代码如下:

object ImplcitTest {

  def main(args: Array[String]) {
    import Context._
    val person1 = User("zhangsan")
    println(person1.getStr())

    val filePath = Thread.currentThread.getContextClassLoader.getResource("test.txt").getPath
    println(filePath)
    val readStr = new File(filePath).read()
    println(readStr)
  }

}

class RichFile(val file: File) {
  def read(): String = Source.fromFile(file).mkString
}

object Context {
  implicit def file2String(f: File) = new RichFile(f)
  implicit def user2Person(str: User) = new Person(str.name, 21)

}

case class User(val name:String)

class Person(val name: String, val age: Int) {
  def getStr(): String = this.toString
}

抛出了下面的异常:

Error:(13, 34) value getStr is not a member of com.test.scala.User

Note: implicit method user2Person is not applicable here because it comes after the application point and it lacks an explicit result type

val person1 = User("zhangsan").getStr()

^

它的意思是:隐式转换方法user2Person方法应该在隐式转换应用之前定义。

所以将代码进行了如下修改,异常解决:

class RichFile(val file: File) {
  def read(): String = Source.fromFile(file).mkString
}

object Context {
  implicit def file2String(f: File) = new RichFile(f)
  implicit def user2Person(str: User) = new Person(str.name, 21)

}

case class User(val name:String)

class Person(val name: String, val age: Int) {
  def getStr(): String = this.toString
}

object ImplcitTest {
  def main(args: Array[String]) {
    import Context._
    val person1 = User("zhangsan")
    println(person1.getStr())

    val filePath = Thread.currentThread.getContextClassLoader.getResource("test.txt").getPath
    println(filePath)
    val readStr = new File(filePath).read()
    println(readStr)
  }
}

由此得出的结论是:

1)如果隐式转换的定义和应用在同一个文件中,则隐式转换必须定义在应用点之前,并且在应用点之前需要进行导入;

2)如果不在同一个文件中,只需要在应用点之前进行导入即可;

时间: 2024-10-12 21:43:50

Scala隐式转换类遇到的问题的相关文章

Scala隐式转换

概述 简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型.本文原文出处: http://blog.csdn.net/bluishglc/article/details/50866314 严禁任何形式的转载,否则将委托CSDN官方维护权益! 隐式转换有四种常见的使用场景: 将某一类型转换成预期类型 类型增强与扩展 模拟新的语法 类型类 语法 隐式转换有新旧两种定义方法,旧的定义方法指是的"impli

大数据学习:Scala隐式转换和并发编程(DT大数据梦工厂)

很多Spark代码中使用了隐式转换.隐式参数.隐式类.隐式对象 如果不掌握,基本在读写复杂代码的时候读不懂 并发编程,怎么样进行高效并发,相互之间怎么通信,Spark这种分布式并发肯定非常重要 (Actor.Akka) ==========隐式转换函数============ 可以手动指定将某种类型的对象转换成其它类型的对象或者类 转换原因:假设制定好接口 比如File,我们想要File.dtSpark的方法,在JAVA中不行 如果在Scala里面我们可以进行升级,将File编程其它类型,就用之

第5课:彻底精通Scala隐式转换和并发编程及Spark源码阅读

隐式转换函数implicit def function例如implicit def rddToPairRDDFunctions[K, V](rdd: RDD[(K, V)]) scala> class Person(val name: String)defined class Person scala> class Enginner(val name: String, val salary: Double) { | def code = println(name + " Coding

记录: 一次解决整型溢出攻击(使用scala,隐式转换)

最近项目遇到一次整型溢出攻击 有一个功能,玩家购买num个物品. 每个物品花费14货币. 客户端限制玩家只能购买 1-9999个该物品. 但是某玩家通过技术手段,获得了客户端的运行权限. 于是发送协议购买该物品 306783379 个 于是服务器收到请求进行以下处理 val num = message.getInt("num") //获得客户端发送来的 306783379 val cost = num * produc.price  //这里没有校验物品的数量就直接计算总价了. 所以总

scala 隐式转换

隐式转换第一例

scala自定义隐式转换

Scala自定义隐式转换 一.编写隐式转换类 /** * Author Mr. Guo * Create 2019/4/20 - 17:40 */ object StringImprovments { implicit class StringImprove(s: String) { def increment = s.toString.map(c => (c + 1).toChar) } implicit class Intc(i: Int) { def xx = { Integer.pars

scala入门-10 隐式转换、隐式参数、隐式类

到目前为止,隐式转换是scala的重点和难点了,加油~ 我们先创建一个类名称叫Implicit.scala 再看一个隐式参数的例子: 上面的例子中使用了隐式参数,我们也可以明显的指明参数: 下面看一下隐式类: 相当于: 到目前为止,本人已经把所有scala在spark中开发中所涉及的基础知识练习了一遍了,稍后我会把scala其他方面知识在总结一下 谢谢大家抽出时间阅读

Scala中的Implicit(隐式转换,隐式参数,隐式类)

文章来自:http://www.cnblogs.com/hark0623/p/4196452.html  转发请注明 代码如下: /** * 隐式转换 隐式参数 隐式类 */ //隐式转换 class Implicit(a: A) { def Test: Unit = { println("Implicit") } } class A { } object Implicit { //隐式转换 implicit def a2Implicit(a: A) = new Implicit(a)

scala中隐式转换之隐式转换调用类中本不存在的方法

/** * Created by root * Description : 隐式转换调用类中本不存在的方法 */ class Person(name : String){ def getPersonName = println("name = " + name) } object Type2Type{ implicit def type2(a : ImplicitTest2) = new Person("xiaoming") } class ImplicitTest