【daily】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>的子类?
【daily】Java泛型 - 返回父类的子类的更多相关文章
- 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 ...
随机推荐
- SpringBoot项目版本升级:从1.5.3升级到2.1.8版本
SpringBoot项目版本升级:从1.5.3升级到2.1.8版本 前言 简单记录一次本人在自己的SpringBoot项目project-template中,把1.5.3版本升级到2.1.8版本时升级 ...
- 【题解】P1020 导弹拦截
[题解]P1020 导弹拦截 从n^2到nlogn 第二问就是贪心,不多说 第一问: 简化题意:求最长不下降子序列 普通n^2: for (int i = 1; i <= n; i++) for ...
- 【Java并发工具类】StampedLock:比读写锁更快的锁
前言 ReadWriteLock适用于读多写少的场景,允许多个线程同时读取共享变量.但在读多写少的场景中,还有更快的技术方案.在Java 1.8中, 提供了StampedLock锁,它的性能就比读写锁 ...
- 我说我了解集合类,面试官竟然问我为啥HashMap的负载因子不设置成1!?
在Java基础中,集合类是很关键的一块知识点,也是日常开发的时候经常会用到的.比如List.Map这些在代码中也是很常见的. 个人认为,关于HashMap的实现,JDK的工程师其实是做了很多优化的,要 ...
- python 安装自己下载的whl依赖
下载好之后保存到相应的地方,如下载了xxxx.whl文件并将它保存在D:\python\project目录下,然后 pip install D:\python\project\xxxx.whl即可
- 学习shiro最佳实践,绝对正确
按照https://blog.csdn.net/qq_34021712/column/info/26947学习,基本能解决shiro一切问题,谢谢该博主
- form中label标签对齐,内容右对齐
给label设置一个固定长度即可: label{ display:inline-block; width:100px; text-align:right; }
- 学习MVC框架,处理分页和删除分页转跳的问题
第一次写博客,文采不好请多见谅,这里主要是写一下,自己是如何处理分页问题,我想初学者也遇到过这个问题. 分页的情况下,编辑信息有返回和编辑2个按钮,操作后都是应该返回原分页界面,使用TempData把 ...
- 全文搜索引擎 Elasticsearch 入门:集群搭建
本文主要介绍什么是 ElasticSearch 以及为什么需要它,如何在本机安装部署 ElasticSearch 实例,同时会演示安装 ElasticSearch 插件,以及如何在本地部署多实例集群, ...
- 转载【React Native代码】手写验证码倒计时组件
实例代码: import React, { Component , PropTypes} from 'react'; import { AppRegistry, StyleSheet, Text, V ...