Linux ·

Java 逆变与协变的名词说明

  最近在研究Thinking in Java的时候,感觉逆变与协变有点绕,特意整理一下,方便后人。我参考于Java中的逆变与协变,但是该作者整理的稍微有点过于概念化,我在这里简单的说一下

我对于协变于逆变的理解

一:协变

  协变返回类型指的是子类中的成员函数的返回值类型不必严格等同于父类中被重写的成员函数的返回值类型,而可以是更 "狭窄" 的类型。当然协变也会出现在数据,泛型等地方。

1:协变的简单实例

  参考于 “理解Java中的协变返回类型”。 下边代码中,子类方法的返回值类型是父类方法返回值类型的子类型,这就是简单的协变示意。

import java.io.ByteArrayInputStream;
import java.io.InputStream;

class Base
{
   
//子类Derive将重写此方法,将返回类型设置为InputStream的子类
  public InputStream getInput()
  {
      
return System.in;
  }
}
public  class Derive extends Base
{
   
    @Override
   
public ByteArrayInputStream getInput()
    {
       
       
return new ByteArrayInputStream(new byte[1024]);
    }
   
public static void main(String[] args)
    {
        Derive d
=new Derive();
        System.out.println(d.getInput().getClass());
    }
}
/*程序输出:
class java.io.ByteArrayInputStream
*/

2:数组使用协变

   数组支持协变, 比如 Parent [] pets =new  Son[10] 。如果 son是parent的子类,那么这种定义形式在Java编译期是允许的。

但是,java中

参与评论