java 泛型 父类_Java泛型 - 返回父类的子类

一、栗子

48304ba5e6f9fe08f3fa1abda7d326ab.png

public class GenericityInher {

//error: Type mismatch: cannot convert from ArrayList to ArrayList

public ArrayList list(){

return new ArrayList();

}

//right

public Parent inher(){

return new Child();

}

//ERROE: Type mismatch: cannot convert from Parent to Human

public Human hum(){

return new Parent();

}

}

class Human{}

class Parent{}

class Child extends Parent{}

48304ba5e6f9fe08f3fa1abda7d326ab.png

期望:因为Parent是Child的父类,所以List是List的父类。所以list()方法能正确返回;

结果:看IDE给出的错误,明确的说明是”ArrayList无法转换成ArrayList”,并不是“Parent无法转换成Child”。

解决方式一:

public ArrayList extends Parent> listChild(){

return new ArrayList();

}

此方式关键问题:因为用的是?,所以导致此方法返回的list只可读,不可写。(具体原因可以去baidu/google)

解决方式二:

public ArrayList listChild(){

return (ArrayList) new ArrayList();

}

除开需要显示强制类型转换外,不知道是否存在别的问题。

二、为什么导致以上问题?

现阶段我也只能简单的说:是java对泛型的定义,导致了以上问题。

所以,牵涉到泛型的都会有这种问题。再如Map

//ERROE: Type mismatch: cannot convert from HashMap to Map

public Map map(){

return new HashMap();

}

推荐一篇探讨java泛型的文章:Java 理论和实践: 了解泛型

三、探讨:java中private修饰的属性/方法会被子类“继承”吗?

别急着下结论!

结论无非就是:  1、不继承。 2、继承,但由于private修饰,并不可用。

虽然不管是哪种结论,“结果”都不会改变(继承private子类也不能用)。

(1)为什么说“不继承”?

貌似很多书、博文、回答等,给的答案都是直接的:“被private修饰的属性/方法不会被子类继承”。

以下是官方oracle docs jdk1.8原文:(jdk1.7是一样)

55a5c94091d2c0f36f4f269c92a258a0.png

官方文档给的结果就是:not inherited。

(2)为什么说“继承”?

虽然官网给的结果是:not inherited。但为什么有些人认为“继承”呢?

这其实算如何理解“继承”这个词语。

正如对“重构”这个词的理解,什么才算“重构”?

举个栗子:你写了一个功能,把excel数据转换成JavaBean。你balabala的写完了,在一个方法里面。

写完后你觉得代码写的太难看,你把这1个方法拆成了N个方法。把重复的代码抽成一个新的方法,把一堆乱七八糟的方法抽成独立的方法。

总之就是把这一个方法,修改成符合SOLID的N个方法。

那么这能算“重构”吗? 我个人认为是,这是我对“重构”这个词的理解。虽然可能与“重构”的原意不一样。

回过来看继承,为什么有些人认为private能被子类“继承”?

因为,子类的内存对象中存在private的属性!

48304ba5e6f9fe08f3fa1abda7d326ab.png

public class DiscussInheritance {

public static void main(String[] args) {

Son son = new Son();

System.out.println(son);

}

}

class Father{

public int p_public = 0;

private int p_private = 1;

protected int p_protected = 2;

private void pPrivate(){}

public void pPublic(){}

}

class Son extends Father{}

48304ba5e6f9fe08f3fa1abda7d326ab.png

0a8d585b5585acc9a29ba1b0a7a95199.png

附录:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值