一、栗子

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. Codeforces 922 C - Robot Vacuum Cleaner (贪心、数据结构、sort中的cmp)

    题目链接:点击打开链接 Pushok the dog has been chasing Imp for a few hours already. Fortunately, Imp knows that ...

  2. 《Python学习手册 第五版》 -第8章 列表与字典

    前面已经讲过数值类型(第5章)和字符串类型(第7章),本章继续其他数据类型的讲解:列表和字典 本章的核心内容 1.列表 1)什么是列表 2)基本列表操作 3)列表迭代和推导 4)索引.分片和矩阵 5) ...

  3. vue仓库、组件间通信、前后台数据交互、前端储存数据大汇总

    目录 路由重定向 仓库介绍 vuex插件:可以完成任意组件间信息交互(移动端) 前端存储数据大汇总 前后台交互方式(重点) 前后台数据交互 axios插件:完成前后台ajax交互的 同源策略 - 前后 ...

  4. 利用视频解析网站免费观看各大平台VIP电影

    需求: 观看VIP电影.VIP电视 准备: 1.视频解析网站 2.VIP电影URL 教程开始: 1.百度搜索[视频解析],会索引出大量的视频解析网站,随便选择一个网站. 2.找到想观看的VIP视频,复 ...

  5. Vscode开发Java环境搭建

    VSCode 开发 JAVA 微软为 Java 开发者推出了一个 Visual Studio Code 的安装程序.Visual Studio Code 中目前提供了许多 Java 扩展. 该软件包可 ...

  6. centos7.5下yum安装mysql-5.6.43

    cd ~/ && cat /etc/redhat-release yum list installed |grep mysql #<===查看是否安装mysql,如果已经安装,使 ...

  7. 部署LAMP环境搭建一个网站论坛平台

    修改主机名 Hostname openstack-001 Hostname Login 修改本地域名解析 Vi /etc/hosts 最后一行添加 192.168.1.56 openstack-001 ...

  8. 使用Python批量更新服务器文件【新手必学】

    买了个Linux服务器,Centos系统,装了个宝塔搭建了10个网站,比如有时候要在某个文件上加点代码,就要依次去10个文件改动,虽然宝塔是可视化页面操作,不需要用命令,但是也麻烦,虽然还有git的h ...

  9. JS-重写内置的call、apply、bind

    首先看call和apply,第一个参数就是改变的this指向,写谁就是谁,如果是非严格模式下,传递null或undefined指向的也是window,二者唯一的区别是执行函数时,传递的参数方式不同,c ...

  10. css中的盒子模型是什么?

    什么是CSS 盒子模型(Box Model) 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用. CSS盒模型本质上是一个盒子,封装周 ...