Java泛型 - 返回父类的子类
一、栗子

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>的子类?
原文地址:https://www.cnblogs.com/VergiLyn/p/6349601.html
Java泛型 - 返回父类的子类的更多相关文章
- 【daily】Java泛型 - 返回父类的子类
一.栗子 public class GenericityInher { //error: Type mismatch: cannot convert from ArrayList<Child&g ...
- Java静态函数、父类、子类执行顺序
package class_test; /** * 静态函数.父类.子类执行顺序 * @author root * */ public class Test { public static void ...
- java基础:父类与子类之间变量和方法的调用
1)父类构造函数 java中当调用某个类的构造方法的时候,系统总会调用父类的非静态初始化块进行初始化,这个调用是隐式的,而且父类的静态初始化代码 块总是会被执行,接着调用父类的一个或者多个构造器执行初 ...
- Java继承中父类和子类构造函数的问题
父类有无参构造函数时(显示或隐式),子类的有参和无参构造函数都是默认调用父类的无参构造函数:当父类只有有参构造函数时,子类可以有有参和无参构造函数,子类有参构造函数必须显式调用父类的有参构造函数,子类 ...
- java继承子父类构造函数-子类的实例化过程
1 /* 2 * 子父类中的构造函数的特点. 3 * 在子类构造对象时,发现,访问子类构造函数时,父类也运行了. 4 * 为什么呢? 5 * 原因是:在子类的构造函数中第一行有一个默认的隐式语句.su ...
- 使用Java泛型返回动态类型
返回一个指定类型的集合,并且clazz必须继承IGeoLog对象或者是其本身 <T extends IGeoLog> List<T> getLogListSql(Class&l ...
- java泛型基础、子类泛型不能转换成父类泛型
参考http://how2j.cn/k/generic/generic-generic/373.html 1.使用泛型的好处:泛型的用法是在容器后面添加<Type>Type可以是类,抽象类 ...
- java泛型基础、子类泛型不能转换成父类泛型--未完待续
参考http://how2j.cn/k/generic/generic-generic/373.html 1.使用泛型的好处:泛型的用法是在容器后面添加<Type>Type可以是类,抽象类 ...
- Java特性之多态父类与子类之间的调用
问题描述: Java三大特性,封装.继承.多态,一直没搞懂其中多态是什么,最近研究了一下,关于父类和子类之间的调用.下面是一个测试类,源代码如下: package com.test; public c ...
随机推荐
- C Primer Plus--C预处理器和C库(1)
目录 预处理符号 明显常量 #define 编译程序之前,先由预处理器检查程序(因此称为预处理器).根据程序中使用的预处理器指令,预处理用符号缩略语所代表的内容替换程序中的缩略语. 预处理器可以根据你 ...
- (转载)ranger原理
文章目录 一.业务背景 现状&&需求 二.大数据安全组件介绍与对比 1.Kerberos 2.Apache Sentry 3.Apache Ranger 4.为什么我们选择Ranger ...
- tomcat启动报错java.lang.OutOfMemoryError:PermGen space解决办法
tomcat启动错误提示: 严重: Error waiting for multi-thread deployment of WAR files to completejava.util.concur ...
- Tracking without bells and whistles
Tracking without bells and whistles 2019-08-07 20:46:12 Paper: https://arxiv.org/pdf/1903.05625 Code ...
- 2018 python获取动态User-Agent
from fake_useragent import UserAgent ua = UserAgent() headers = {'User-Agent': ua.random} print(ua.r ...
- [Bayes] Concept Search and LSI
基于术语关系的贝叶斯网络信息检索模型扩展研究 LSI 阅读笔记 背景知识 提出一种改进的共现频率法,利用该方法挖掘了索引术语之间的相关关系,将这种相关关系引入信念网络模型,提出了一个具有两层术语节点的 ...
- 深入分析GCC
深入分析GCC 目录 前言章 GCC概述 11.1 GCC的产生与发展 11.2 GCC的特点 21.3 GCC代码分析 3第2章 GCC源代码分析工具 42.1 vim ctags代码阅读工具 42 ...
- C++之future和promise
future和promise的作用是在不同线程之间传递数据.使用指针也可以完成数据的传递,但是指针非常危险,因为互斥量不能阻止指针的访问:而且指针的方式传递的数据是固定的,如果更改数据类型,那么还需要 ...
- [LeetCode] 803. Bricks Falling When Hit 打击砖块掉落
We have a grid of 1s and 0s; the 1s in a cell represent bricks. A brick will not drop if and only i ...
- 高级UI-画笔Paint
在UI这一块,谈到自定义,就离不开画笔和画布的使用话题,在自定义控件的时候,为了做出炫酷的效果,我们往往会使用画笔和画布,那么这里我们就先来看看画笔的使用吧 简单使用例子 自定义一个View publ ...