数组中的协变原则

原创 2018年04月17日 16:52:22

根据LSP原则,我们可以知道子类型方法参数是逆变的,而子类型的返回值是协变的。

下面我想测试的是在数组中所存在的协变原则

代码如下:

public  class test {
    public static void main(String[] args) {
        Number[] numbers= new Number[2];
        numbers[0]=new Integer(10);

        numbers[1]=new Double(3.14);

        for(Number n:numbers)
        {
            System.out.println(n);
        }

    }

}

运行结果如下:


可以知道在数组中可以存放子类型元素,由于Integer和Double均为Number的子类型,故可以正确放入并且取出,满足协变原则

再开下面的例子:

public  class test {
    public static void main(String[] args) {
        Integer[] myInts={1,2,3,4};
        Number[] myNumber=myInts;
        myNuber[0]=3.14;
        for(Number n:myNumber)
        {
            System.out.println(n);
        }
    }

}

可以知道在子类型数组中不能够放入父类型的数组,会在静态类型检查的时候就报错


可以从以上的例子得到数组中实际上是蕴含着协变原则的

协变、逆变与不变:数组、泛型、与返回类型

1. 前言之前几篇博文,有些地方涉及到了协变性、逆变性与不变性在Java中的表现,所以这篇博文将重点记录这方面的内容,并辅以JDK源码中的一些实例,加以说明。2. 定义这里讨论的协变、逆变与不变都是编...
  • yi_Afly
  • yi_Afly
  • 2016-07-30 17:38:11
  • 1063

Java——协变数组和类型擦除(covariant array type erasure)

1、数组的协变性 数组的协变性(covariant)是指: 如果类Base是类Sub的基类,那么Base[]就是Sub[]的基类。 而泛型是不可变的(invariant),List不...
  • shanshan3548
  • shanshan3548
  • 2014-07-27 23:47:52
  • 1532

数组是协变的,具体化的

数组是协变的,如果Apple是Fruit的子类型,那么数组类型Apple[]就是Fruit[]的子类型,所以这就使得此向上转型是成立的。 Fruit[] apples=new Apple[s...
  • zjq2008wd
  • zjq2008wd
  • 2013-04-11 15:46:57
  • 1385

C#4.0中的协变和逆变

C#4.0中的协变和逆变(也可叫抗变)   谈谈.Net中的协变和逆变 关于协变和逆变要从面向对象继承说起。继承关系是指子类和父类之间的关系;子类从父类继承所以子类的实例也就是父类的实例。比如说...
  • limlimlim
  • limlimlim
  • 2012-08-01 11:34:36
  • 4466

Java语言中的协变和逆变

协变和逆变指的是宽类型和窄类型在某种情况下的替换或交换的特性。 协变就是用一个窄类型替代宽类型 逆变则用宽类型覆盖窄类型。...
  • u014717036
  • u014717036
  • 2016-08-17 21:07:29
  • 1483

Java协变数组和类型擦除

1、数组的协变性 数组的协变性(covariant)是指: 如果类Base是类Sub的基类,那么Base[]就是Sub[]的基类。 而泛型是不可变的(invariant),List不会是List...
  • zs064811
  • zs064811
  • 2016-04-27 11:24:48
  • 244

Java的协变数组类型

语言设计中的困难之一就是如何处理集合类型的继承问题。 假设Employee IS-A Person,那么,是不是意味着数据Employee[ ] IS-A Person[ ] 呢?换句话说,如果一个例...
  • DiligentDog
  • DiligentDog
  • 2017-11-14 21:41:52
  • 75

C#的协变和抗变

本文摘抄自《C#高级编程 第七版》
  • jiangzhanchang
  • jiangzhanchang
  • 2014-09-02 10:30:25
  • 5656

协变数组和类型擦除

1、数组的协变性: 数组的协变性指的是:如果类Base是类Sub的基类,那么Base[]就是Sub[]的基类。 而泛型是不可变的,List不是List的基类,更不会是它的子类。 2、数组的具体化...
  • zhourong1992
  • zhourong1992
  • 2017-08-01 14:11:13
  • 75

C#:协变和抗变

协变和抗变 一.定义 在说定义之前,先看一个简单的例子: public class Sharp { } public class Rectange : Sharp ...
  • sudazf
  • sudazf
  • 2013-12-06 00:50:10
  • 2929
收藏助手
不良信息举报
您举报文章:数组中的协变原则
举报原因:
原因补充:

(最多只允许输入30个字)