`
bit1129
  • 浏览: 1067723 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【Scala十五】Scala核心九:隐式转换之二

 
阅读更多

隐式转换存在的必要性,

 

在Java Swing中,按钮点击事件的处理,转换为Scala的的写法如下:

 

val button = new JButton
button.addActionListener(
    new ActionListener {
        def actionPerformed(event: ActionEvent) {
            println("pressed!")
        }
    }
)

 这是典型的Java-Style的代码,虽然使用Scala语法去写的,这个代码,真正有用的只有一句,println("pressed")

 

 

改写一下:

button.addActionListener((_: ActionEvent) => println("pressed!"))

 但是编译失败,原因是addActionListener方法只能接受ActionListener对象作为参数,而不能使用函数常量作为参数,为了消除这种gap,就得定义隐式转换,将函数(确切的说,是将带有ActionEvent类型的参数的函数)转换为ActionListener对象

 

implicit def function2ActionListener(f: ActionEvent => Unit) =
  new ActionListener {
       def actionPerformed(event: ActionEvent) = f(event) //直接赋值
  }
) 

 

隐式转换的工作流程:

The way this code works is that the compiler first tries to compile it as is, but it sees a type error. Before giving up, it looks for an implicit conversion that can repair the problem. In this case, it finds function2ActionListener. It tries that conversion method, sees that it works, and moves on.

 

implicit修饰符可以作用变量、function,class和object上

 

隐式转换的规则:

1. Marking Rule: Only definitions marked implicit are available

2. Scope Rule: An inserted implicit conversion must be in scope as a single identifier, or be associated with

the source or target type of the conversion.

3. One-at-a-time Rule: Only one implicit is tried

4. Explicits-First Rule: Whenever code type checks as it is written, no implicits are attempted.

如果编译时没有类型错误,Scala编译器就不会启动隐式转换功能,即使有满足条件的隐式转换存在

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    scala-2.12.6.tgz

    Scala还引入了一些独特的语言特性,如特质(Traits)、隐式转换和case类,这些帮助开发者实现更简洁、更具表达力的代码。 10. 社区与文档: Scala有一个活跃的社区,提供了丰富的开源库和工具,以及详尽的官方...

    scala入门精华讲义

    3. 隐式转换:Scala支持隐式转换,允许在特定上下文中将一个类型转换为另一个类型,提高代码的简洁性。 三、函数式编程概念 1. 高阶函数:如前所述,函数可以作为一等公民,可以赋值给变量、作为参数或返回结果。 ...

    尚硅谷大数据之Scala语言核心编程.pdf

    对于变量类型转换,书中提供了隐式转换和强制类型转换的方法,并对值类型和String类型之间的转换进行了说明。标识符的命名规范也是本书的重点之一,包括了命名概念、规则、举例说明和命名注意事项。 第三章主要介绍...

    Scala程序设计第二版

    5. **类型系统**:Scala拥有丰富的类型系统,包括类型推断、类型类、隐式转换等。这部分内容对于理解Scala代码的运行机制至关重要。 6. **Actor模型和并发编程**:Scala内置了Akka库,提供了基于Actor模型的并发...

    韩顺平_Scala语言核心编程 .zip

    此外,Scala还有模式匹配、类型别名、隐式转换等功能,增强了类型系统的灵活性。 4. **表达式导向**:Scala鼓励使用表达式而不是语句,这使得代码更加简洁。例如,if-else表达式可以返回一个值,而不仅仅是执行一个...

    Programming in Scala 2nd Edition

    6. **高级特性**:涵盖Scala的一些更高级特性,比如模式匹配、隐式转换、反射等。 7. **标准库和框架**:介绍了Scala的标准库以及常用的框架,如Play Framework、Akka等。 8. **最佳实践和设计模式**:提供了一些...

    scala 案例

    11. ** implicits**:隐式转换和隐式参数是Scala中的一种高级特性,允许在上下文中透明地引入额外的功能。 通过分析这个"Scala案例",你将有机会实践这些概念,并了解如何在实际项目中运用Scala。学习这些知识点...

    最好的scala学习 课件

    这部分还会讲解伴生对象(companion object)和隐式转换,这些特性使得Scala的面向对象设计更加灵活。 "Scala进阶之路-part04-Akka Actor.pdf"专注于Akka框架,这是Scala中用于构建分布式、容错系统的工具。Actor...

    Scala最新官方下载包(官方的下载真的慢)

    9. **复合性管理**:Scala通过特质、包对象和隐式转换等机制,帮助开发者有效地管理复杂的系统。 10. **Dotty编译器**:虽然这里提到的是Scala 2018.1.8版本,但值得注意的是,Scala社区后来开发了Dotty编译器,...

    Programming In Scala 中文版及英文版

    10. **隐式转换**:Scala的隐式转换可以在适当的时候自动将一个类型转换为另一个类型,简化了代码,但也需要谨慎使用以防止意外的类型转换。 **进阶知识点** 11. **Scaladoc**:Scala的文档生成工具,用于创建API...

    Effective Scala中文版

    7. **隐式转换与上下文绑定**:Scala的隐式转换和上下文绑定是其一大特色,它们可以用来解决类型转换的繁琐和简化API。但隐式转换需要谨慎使用,防止引入难以调试的问题。 8. **对象与模块化**:Scala中的对象和...

    scala例子 实例

    3. 类型系统:Scala具有强大的类型系统,包括隐式转换、类型推断和类型参数化。这使得代码更安全,同时减少了编译时错误。 4. 语法简洁:Scala的语法设计得非常简洁,比如使用`_`通配符、模式匹配和for-...

    scala-docs-2.11.8.rar

    **一、Scala核心概念** 1. **类型系统**:Scala的强类型系统允许静态类型检查,确保程序的健壮性。它还支持类型推断,使得代码更简洁。 2. **模式匹配**:Scala提供了强大的模式匹配功能,可以用于解构复杂数据结构...

    scala 教程

    - **高层级**:Scala提供了许多高级特性,如模式匹配、隐式转换等,这些特性使得开发更加高效。 - **静态类型**:Scala是一种静态类型语言,这意味着编译时就可以检测到类型错误,有助于提高代码质量。 #### 三、...

    Scala编程完整版

    7. 隐式转换和隐式参数:了解隐式转换和隐含参数如何简化代码并增强类型系统的表达力。 8. 并发和Actor模型:Scala提供了Actor模型来支持并发编程,这是一种基于消息传递的并发机制。 通过深入学习和实践,你可以...

    Scala Overview

    8. 隐式转换:隐式转换允许在适当的情况下自动将一个类型的实例转换为另一个类型的实例,简化了代码,并支持类型系统的扩展。 9. 闭包和匿名函数:Scala中的闭包是第一类的,这意味着它们可以被赋值、作为参数传递...

    scala学习-project.zip

    9. **隐式转换**:Scala的隐式转换允许在特定上下文中将一个类型转换为另一个类型,这可以简化API的使用,但需谨慎使用,以免引入不必要的复杂性。 10. **元编程**:Scala的反射和类型系统支持元编程,即在运行时...

Global site tag (gtag.js) - Google Analytics