Scala List中的上界下界以及逆变、协变

package com.dt.scala.list

abstract class Big_Data
class Hadoop extends Big_Data
class Spark extends Big_Data

object List_Constructor_Internals {
  def main(args: Array[String]): Unit = {
    val hadoop = new Hadoop :: Nil    //创建hadoop列表
    val big_data = new Spark :: hadoop   //在hadoop列表前边追加Spark,然而Spark和Hadoop本身类型不同,他们的父类类型相同
    //此时得到的新列表big_data 类型是Big_Data;
//    也可以写成:     hadoop.::(new Spark)
  }
  // :: 操作的源码定义:
//  def ::[B >: A](x: B) : List[B] = new scala.collection.immutable.::(x,this)
  //是泛型,A是以B为上界的,或者说B是以A为下界的。返回是上界B,list是协变的,函数的参数(x:B)其实是逆变的。
  //函数的参数时逆变的,就不能保持函数的返回结果类型是协变的了。使得list可以容纳具体的上界的所有子类型。
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 02:46:06

Scala List中的上界下界以及逆变、协变的相关文章

.NET中的逆变协变

MSDN上的说法: 协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型,后者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型----------(注意,这里说的可以使用更具体的类型是指可以给跟具体的类型传递相对不太具体的参数). 泛型类型参数支持协变和逆变,可在分配和使用泛型类型方面提供更大的灵活性. 在引用类型系统时,协变.逆变和不变性具有如下定义. 这些示例假定一个名为 Base 的基类和一个名为 Derived 的派生类.使你能够使用比原

分享来自中港扬盛变频电源逆变功能模块的故障原因

关于变频电源的原理之前讲过了,但是还是有很多用户和企业都还是不太知道,也不太注意在对中港扬盛的变频电源进行正常的维护和保养方法. 在不同季节当中使用变频电源时,中港扬盛的单相.三相变频电源在不同环境使用也要注意一些问题,比如:夏天要注意散热问题,以及防潮,防湿等等诸多问题. 那么今天我主要是与大家分享的是关于中港扬盛请添加链接描述变频电源中逆变功能模块的维护方法的介绍. 首先我们要知道变配电源逆变功能模块由几个组成的:在侧板的上方,由IGBT,散热片,风扇,滤波电容等等组成的. 下面再列举一些变

逆变协变

适用范围 协变逆变在接口泛型和委托泛型中而言 协变 把子类赋值给父类.OUT只能修饰输出参数. IEnumerable<Para> lp = new List<Chid>(); IMyCustomList<Para> c = new MyCustomList<Chid>(); 逆变 把父类赋值给子类.IN只能修饰输入参数. IMyCustomList<Chid> c = new MyCustomList<Para>(); 面向对象中任

Java中的逆变与协变(转)

看下面一段代码 Number num = new Integer(1); ArrayList<Number> list = new ArrayList<Integer>(); //type mismatch List<? extends Number> list = new ArrayList<Number>(); list.add(new Integer(1)); //error list.add(new Float(1.2f)); //error 有人会

Java中的逆变与协变

看下面一段代码 Number num = new Integer(1); ArrayList<Number> list = new ArrayList<Integer>(); //type mismatch List<? extends Number> list = new ArrayList<Number>(); list.add(new Integer(1)); //error list.add(new Float(1.2f)); //error 有人会

Java中的逆变与协变 很直接不饶弯的讲出来了

http://blog.csdn.net/z69183787/article/details/51598345 看下面一段代码: Number num = new Integer(1); List<Number> list = new ArrayList<>(); list.add(new Integer(3)); ArrayList<Number> list = new ArrayList<Integer>(); //type mismatch List&

C#中的协变OUT和逆变

泛型接口和泛型委托中经常使用可变性 in  逆变,out  协变 从 list<string>转到list<object> 称为协变 (string 从object 派生,那么 string 转成object 是合理的,子类替换父类是合理的,) 从list<object> 转到 list<string> 称为逆变 (经object 转成string ,将父类转成子类,是不合理的,称为逆变) 1.逆变代码掩饰 static void Main(string[]

C# 逆变与协变

原文:C# 逆变与协变 该文章中使用了较多的 委托delegate和Lambda表达式,如果你并不熟悉这些,请查看我的文章<委托与匿名委托>.<匿名委托与Lambda表达式>以便帮你建立完整的知识体系. 在C#从诞生到发展壮大的过程中,新知识点不断引入.逆变与协变并不是C#独创的,属于后续引入.在Java中同样存在逆变与协变,后续我还会写一篇Java逆变协变的文章,有兴趣的朋友可以关注一下. 逆变与协变,听起来很抽象.高深,其实很简单.看下面的代码: class Person {

C#逆变

在好多的.net的书籍中都看到过逆变和协变的概念,也在网上搜了一些关于这两个概念的解释,但是一直感觉似懂非懂的,直到最近在项目中实际遇到了一个问题,恰好用到了逆变,总算对逆变的理解又进了一步. 逆变只能用到泛型接口和委托中,以前一直不理解为什么要用在泛型中,今天终于想明白了.在介绍逆变之前,先来说说泛型,泛型的作用就是算法的重用,举个例子 1 public class EntityBase<T> 2 { 3 DbContext db = new DbContext(); 4 public vo