一、栗子

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. 基于MXNet的im2rec.py的debug

    1.im2rec.py调试错误:multiprocessing not available, fall back to single threaded encoding imread 经过查找发现是程 ...

  2. Codeforces 1087C Connect Three (思维+模拟)

    题意: 网格图选中三个格,让你选中一些格子把这三个格子连起来,使得选中的格子总数最小.最后输出方案 网格范围为1000 思路: 首先两点间连起来最少需要的格子为他们的曼哈顿距离 然后连接方案一定是曼哈 ...

  3. IniRealm讲解

    Shiro自定义Realm 内置Realm: user.ini [users] Mark=123456,admin [roles] admin=user:delete,user:update IniR ...

  4. PyObject and PyTypeObject - Python 中的 '对象' 们

    1 PyObject, PyTypeObject - Python 中的 '对象' 们 '一切皆对象' - 这是 Python 的学习和使用者们最最常听到一句, 可谓 博大精深 - '勃大精深'. ' ...

  5. 面向对象之包装类与Object类

    一.包装类(Wrapper) 1.包装类出现原因 为了使8种基本数据类型的变量具有类的特征,引入包装类 2.类型间转化 ① 基本数据类型---->对应的包装类:自动装箱 包装类---->对 ...

  6. k8s系列---service

    来源 : http://blog.itpub.net/28916011/viewspace-2214745/ service是要通过coreDNS来管理pod的. kube-proxy始终监视着api ...

  7. 分形的奥秘!分形着色器!shader 编程入门实战 ! Cocos Creator!

    极致的数学之美! 什么是分形? "一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状" 简单来说,分形(fractal)就像这个doge表情包 ...

  8. 学会springboot多环境配置方案不用5分钟

    一 前言 本篇文章的主题是在springboot中写多个配置文件,指定让个配置文件生效,以便于达到在开发环境,测试环境,线上环境根据不同的配置灵活应用:读完本篇你将获得,学会springboot的多环 ...

  9. Android.bp文件简介

    Android.bp是用来替换Android.mk的配置文件,它使用Blueprint框架来解析.Blueprint是生成.解析Android.bp的工具,是Soong的一部分.Soong则是专为An ...

  10. Android布局管理器-使用LinearLayout实现简单的登录窗口布局

    场景 Android布局管理器-从实例入手学习相对布局管理器的使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1038389 ...