• 68046

    文章

  • 643

    评论

  • 65

    友链

  • 最近新加了换肤功能,大家多来逛逛吧~~~~
  • 喜欢这个网站的朋友可以加一下QQ群,我们一起交流技术。

Scala Type Parameters 2

撸了今年阿里、腾讯和美团的面试,我有一个重要发现.......>>
  • 类型关系

    Scala 支持在泛型类上使用型变注释,用来表示复杂类型、组合类型的子类型关系间的相关性

    • 协变 +T,变化方向相同,通常用在生产

      假设 A extends T, 对于 Clazz[+T],则 Clazz[A] 也可看做 Clazz[T]

      // 官网示例
      abstract class Animal {
        def name: String
      }
      case class Cat(name: String) extends Animal
      case class Dog(name: String) extends Animal
      

      由于 Scala 标准库中不可变 List 的定义为 List[+A],因此 List[Cat]List[Animal] 的子类型, List[Dog] 也是 List[Animal] 的子类型,所以可直接将他们当作 List[Animal] 使用。

      // 官网示例
      object CovarianceTest extends App {
        def printAnimalNames(animals: List[Animal]): Unit = {
          animals.foreach { animal =>
            println(animal.name)
          }
        }
      
        val cats: List[Cat] = List(Cat("Whiskers"), Cat("Tom"))
        val dogs: List[Dog] = List(Dog("Fido"), Dog("Rex"))
      
        printAnimalNames(cats)
        // Whiskers
        // Tom
      
        printAnimalNames(dogs)
        // Fido
        // Rex
      }
      
    • 逆变 -T,变化方向相反,通常用在消费

      假设 A extends T, 对于 Clazz[-T],则 Clazz[T] 也可看做 Clazz[A]

      // 官网示例
      abstract class Printer[-A] {
        def print(value: A): Unit
      }
      
      class AnimalPrinter extends Printer[Animal] {
        def print(animal: Animal): Unit =
          println("The animal's name is: " + animal.name)
      }
      
      class CatPrinter extends Printer[Cat] {
        def print(cat: Cat): Unit =
          println("The cat's name is: " + cat.name)
      }
      
      object ContravarianceTest extends App {
        val myCat: Cat = Cat("Boots")
      
        def printMyCat(printer: Printer[Cat]): Unit = {
          printer.print(myCat)
        }
      
        val catPrinter: Printer[Cat] = new CatPrinter
        val animalPrinter: Printer[Animal] = new AnimalPrinter
      
        printMyCat(catPrinter)
        printMyCat(animalPrinter) // 将 Printer[Animal] 当作 Printer[Cat] 使用
      }
      

 转载至链接:https://my.oschina.net/u/3606656/blog/3115065。

695856371Web网页设计师②群 | 喜欢本站的朋友可以收藏本站,或者加入我们大家一起来交流技术!

欢迎来到梁钟霖个人博客网站。本个人博客网站提供最新的站长新闻,各种互联网资讯。 还提供个人博客模板,最新最全的java教程,java面试题。在此我将尽我最大所能将此个人博客网站做的最好! 谢谢大家,愿大家一起进步!

转载原创文章请注明出处,转载至: 梁钟霖个人博客www.liangzl.com

0条评论

Loading...


发表评论

电子邮件地址不会被公开。 必填项已用*标注

自定义皮肤
注册梁钟霖个人博客