一、栗子

public class GenericityInher {
//error: Type mismatch: cannot convert from ArrayList<Child> to ArrayList<Parent>
public ArrayList<Parent> list(){
return new ArrayList<Child>();
}
//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{}

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

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

解决方式一:

public ArrayList<? extends Parent> listChild(){
return new ArrayList<Child>();
}

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

解决方式二:

public <T extends Parent> ArrayList<T> listChild(){
return (ArrayList<T>) new ArrayList<Child>();
}

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

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

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

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

//ERROE: Type mismatch: cannot convert from HashMap<String,Child> to Map<String,Parent>public Map<String,Parent> map(){
return new HashMap<String, Child>();
}

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

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

别急着下结论!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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{}

附录:

A是B的子类,为什么List<A>就不是List<B>的子类?

oracle docs jdk1.8

Java 理论和实践: 了解泛型

【daily】Java泛型 - 返回父类的子类的更多相关文章

  1. Java泛型 - 返回父类的子类

    一.栗子 public class GenericityInher { //error: Type mismatch: cannot convert from ArrayList<Child&g ...

  2. Java静态函数、父类、子类执行顺序

    package class_test; /** * 静态函数.父类.子类执行顺序 * @author root * */ public class Test { public static void ...

  3. java基础:父类与子类之间变量和方法的调用

    1)父类构造函数 java中当调用某个类的构造方法的时候,系统总会调用父类的非静态初始化块进行初始化,这个调用是隐式的,而且父类的静态初始化代码 块总是会被执行,接着调用父类的一个或者多个构造器执行初 ...

  4. Java继承中父类和子类构造函数的问题

    父类有无参构造函数时(显示或隐式),子类的有参和无参构造函数都是默认调用父类的无参构造函数:当父类只有有参构造函数时,子类可以有有参和无参构造函数,子类有参构造函数必须显式调用父类的有参构造函数,子类 ...

  5. java继承子父类构造函数-子类的实例化过程

    1 /* 2 * 子父类中的构造函数的特点. 3 * 在子类构造对象时,发现,访问子类构造函数时,父类也运行了. 4 * 为什么呢? 5 * 原因是:在子类的构造函数中第一行有一个默认的隐式语句.su ...

  6. 使用Java泛型返回动态类型

    返回一个指定类型的集合,并且clazz必须继承IGeoLog对象或者是其本身 <T extends IGeoLog> List<T> getLogListSql(Class&l ...

  7. java泛型基础、子类泛型不能转换成父类泛型

    参考http://how2j.cn/k/generic/generic-generic/373.html 1.使用泛型的好处:泛型的用法是在容器后面添加<Type>Type可以是类,抽象类 ...

  8. java泛型基础、子类泛型不能转换成父类泛型--未完待续

    参考http://how2j.cn/k/generic/generic-generic/373.html 1.使用泛型的好处:泛型的用法是在容器后面添加<Type>Type可以是类,抽象类 ...

  9. Java特性之多态父类与子类之间的调用

    问题描述: Java三大特性,封装.继承.多态,一直没搞懂其中多态是什么,最近研究了一下,关于父类和子类之间的调用.下面是一个测试类,源代码如下: package com.test; public c ...

随机推荐

  1. vs2017项目上传到github

    如果要把项目提交到一个厂库里面,需要建个git存储库,比如选择新建git库选择VSVIEW文件夹,以后在这个文件夹下的项目,提交时都会提交到VSVIEW这个github仓库 选择的文件夹不在git文件 ...

  2. Loj 6002 最小路径覆盖(最大流)

    题意: 求不相交的最小路径覆盖 思路: 连边跑二分图,匹配一条边相当于缩了一条边,答案为n-maxflow 如果是求可以相交的最小路径覆盖的话,先用Floyd跑出可达矩阵,然后所有可达的点连边跑二分图 ...

  3. 51nod 1133 不重叠的线段 (贪心,序列上的区间问题)

    题意: 最多能选几条不重叠的线段 思路: 按R从小到大排序,维护一个最大的右端点 右端点最小的那个线段是必选的,可以贪心地证明 代码: #include<iostream> #includ ...

  4. IPsecVPN:阿里云VPN网关和深信服防火墙打通公有云和公司内网

    简介 目前许多公司网络环境为混合云(私有云,IDC,公司内网融合)的状态,通过内网ip的访问使得工作更加方便,需求也更为迫切,而本文介绍的即是实现私有云和公司内网互通的一种方法,希望对有此需求的小伙伴 ...

  5. Jmeter之存储测试结果

    前言 Jmeter做接口测试时,发送请求后,我们可以通过察看结果树看到结果,但是如果想要把测试结果保存起来,那该怎么做呢? 一:添加一个登录的http请求,填入正确的ip,接口地址,以及参数 二:右键 ...

  6. POP and IMAP - Post Office Protocol and Internet Message Access Protocol

    POP and IMAP - Post Office Protocol and Internet Message Access Protocol 用来从 SMTP Server 上下载邮件的协议. P ...

  7. 【JavaScript】进制转换&位运算,了解一下?

    前言 在一般的代码中很少会接触到进制和位运算,但这不代表我们可以不去学习它.作为一位编程人员,这些都是基础知识.如果你没有学过这方面的知识,也不要慌,接下来的知识并不会很难.本文你将会学习到: 进制转 ...

  8. 查看 Linux 中文件打开情况(lsof)

    前言 我们都知道,在linux下,“一切皆文件”,因此有时候查看文件的打开情况,就显得格外重要,而这里有一个命令能够在这件事上很好的帮助我们-它就是lsof. Linux 下有哪些文件 在介绍lsof ...

  9. LVS服务原理以及搭建

    一.LVS简介 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,目的在于使用集群技术和Linux操作系统实现一个高性能.高可用的服务器.它 ...

  10. Xcode如何集成Pod教程

    一般开发都会用到很多第三方的框架,利用好他们可以加快开发进度,为了更方便将第三方的框架集成到我们的项目中,Pod是个很好的选择,现在说一下该怎么将Pod集成到我们的Xcode中 第一种方法 命令行的方 ...