java范型_Java知识点总结(Java泛型)

Java知识点总结(Java泛型)

@(Java知识点总结)[Java, Java泛型]

[toc]

泛型

泛型就是参数化类型

适用于多种数据类型执行相同的代码

泛型中的类型在使用时指定

泛型归根到底就是“模版”

优点:使用泛型时,在实际使用之前类型就已经确定了,不需要强制类型转换。

泛型主要使用在集合中

import java.util.ArrayList;

import java.util.List;

public class Demo01 {

// 不使用泛型,存取数据麻烦

public static void test1(){

List list = new ArrayList();

list.add(100);

list.add("zhang");

/*

* 从集合中获取的数据是Object类型,Object类型是所有类型的根类,但是在具体使用的时候需要

* 类型检查,类型转化,处理类型转化异常

* 使用麻烦

*/

Object o = list.get(1);

if (o instanceof String) {

String s = (String)o;

}

System.out.println(o);

}

// 使用泛型

public static void test2(){

List list = new ArrayList();

//list.add(100); 放数据时安全检查,100不是String类型,不能存放

list.add("存数据安全,取数据省心");

String s = list.get(0); //取出来的数据直接就是泛型规定的类型

System.out.println(s);

}

public static void main(String[] args) {

test1();

test2();

}

}

自定义泛型

泛型字母

形式类型参数(formal type parameters)即泛型字母

命名泛型字母可以随意指定,尽量使用单个的大写字母(有时候多个泛型类型时会加上数字,比如T1,T2)

常见字母(见名知意)

T Type

K V Key Value

E Element

当类被使用时,会使用具体的实际类型参数(actual type argument)代替

泛型类

只能用在成员变量上,只能使用引用类型

泛型接口

只能用在抽象方法上

泛型方法

返回值前面加上 &ltT&gt

/**

* 自定义泛型类

*

* 定义"模版"的时候,泛型用泛型字母:T 代替

* 在使用的时候指定实际类型

*

* @author Administrator

* @param

*/

public class Student {

private T javase;

//private static T javaee; // 泛型不能使用在静态属性上

public Student() {

}

public Student(T javase) {

this();

this.javase = javase;

}

public T getJavase() {

return javase;

}

public void setJavase(T javase) {

this.javase = javase;

}

}

/**

* 自定义泛型的使用

* 在声明时指定具体的类型

* 不能为基本类型

* @author Administrator

*

*/

class Demo02 {

public static void main(String[] args) {

//Student Student = new Student(); //不能为基本类型,编译时异常

Student student = new Student();

student.setJavase(85);

System.out.println(student.getJavase());

}

}

/**

* 自定义泛型接口

*

* 接口中泛型字母只能使用在方法中,不能使用在全局常量中

*

* @author Administrator

* @param

*/

public interface Comparator {

//public static final T1 MAX_VALUE = 100; //接口中泛型字母不能使用在全局常量中

//T1 MAX_VALUE;

public static final int MAX_VALUE = 100;

void compare(T2 t);

T2 compare();

public abstract T1 compare2(T2 t);

}

import java.io.Closeable;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.util.List;

/**

* 非泛型类中定义泛型方法

* @author Administrator

*

*/

public class Method {

// 泛型方法,在返回类型前面使用泛型字母

public static void test1(T t){

System.out.println(t);

}

// T 只能是list 或者list 的子类

public static void test2(T t){

t.add("aa");

}

// T... 可变参数 ---> T[]

public static void test3(T...a) {

for (T temp : a) {

try {

if (null != temp) {

temp.close();

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

public static void main(String[] args) throws FileNotFoundException {

test1("java 是门好语言");

test3(new FileInputStream("a.txt"));

}

}

泛型的继承

/**

* 泛型继承

*

* 保留父类泛型 ----》泛型子类

* 不保留父类泛型 -----》子类按需实现

*

* 子类重写父类的方法,泛型类型随父类而定 子类使用父类的属性,该属性类型随父类定义的泛型

*

* @author Administrator

*

* @param

* @param

*/

public abstract class Father {

T1 age;

public abstract void test(T2 name);

}

// 保留父类泛型 ----》泛型子类

// 1)全部保留

class C1 extends Father {

@Override

public void test(T2 name) {

}

}

// 2) 部分保留

class C2 extends Father {

@Override

public void test(Integer name) {

}

}

// 不保留父类泛型 -----》子类按需实现

// 1)具体类型

class C3 extends Father {

@Override

public void test(Integer name) {

}

}

// 2)没有具体类型

// 泛型擦除:实现或继承父类的子类,没有指定类型,类似于Object

class C4 extends Father {

@Override

public void test(Object name) {

}

}

/**

* 泛型擦除

* 类似于Object,不等于Object

* @author Administrator

*

*/

public class Demo03 {

public static void test(Student student){

student.setJavase(100);

}

public static void main(String[] args) {

// 泛型擦除

Student student = new Student();

test(student);

Student student2 = new Student();

//test(student2); //编译异常

}

}

通配符

通配符(Wildcards)

T、K、V、E 等泛型字母为有类型,类型参数赋予具体的值

?未知类型 类型参数赋予不确定值,任意类型

只能用在声明类型、方法参数上,不能用在定义泛型类上

/**

* 泛型的通配符 类型不确定,用于声明变量或者形参上面

*

* 不能使用在类上 或者 new 创建对象上

* @author Administrator

*

*/

public class Demo04 {

// 用在形参上

public static void test(List> list) {

List> list2; // 用在声明变量上

list2 = new ArrayList();

list2 = new ArrayList();

list2 = new ArrayList();

}

public static void main(String[] args) {

test(new ArrayList());

test(new ArrayList());

}

}

extends/super

上限(extends)

指定的类必须是继承某个类,或者实现了某个接口(不是implements),即<=

? extends List

下限(super)

即父类或本身

? super List

import java.util.ArrayList;

import java.util.List;

/**

* extends:泛型的上限 <= 一般用于限制操作 不能使用在添加数据上,一般都是用于数据的读取

*

* supper:泛型的上限 >= 即父类或自身。一般用于下限操作

*

* @author Administrator

* @param

*/

public class Test {

private static void test01() {

Test t1 = new Test();

Test t2 = new Test();

Test t3 = new Test();

}

private static void test02(List extends Fruit> list) {

}

private static void test03(List super Apple> list) {

}

public static void main(String[] args) {

// 调用test02(),测试 extends <=

test02(new ArrayList());

test02(new ArrayList());

test02(new ArrayList());

// test02(new ArrayList()); Object 不是 Fruit 的子类 ,编译不通过

// 调用test03() ,测试super >=

test03(new ArrayList());

test03(new ArrayList());

//test03(new ArrayList()); ReadApple < apple,所以不能放入

}

}

class Fruit {

}

class Apple extends Fruit {

}

class Pear extends Fruit {

}

class ReadApple extends Apple {

}

泛型嵌套

从外向里取

import java.util.Map.Entry;

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

/**

* 泛型嵌套

* @author Administrator

*

*/

public class Demo05 {

public static void main(String[] args) {

Student2 student = new Student2();

student.setScore("优秀");

System.out.println(student.getScore());

//泛型嵌套

School> school = new School>();

school.setStu(student);

String s = school.getStu().getScore(); //从外向里取

System.out.println(s);

// hashmap 使用了泛型的嵌套

Map map = new HashMap();

map.put("a", "张三");

map.put("b", "李四");

Set> set = map.entrySet();

for (Entry entry : set) {

System.out.println(entry.getKey()+":"+entry.getValue());

}

}

}

public class School {

private T stu;

public T getStu() {

return stu;

}

public void setStu(T stu) {

this.stu = stu;

}

}

public class Student2 {

T score;

public T getScore() {

return score;

}

public void setScore(T score) {

this.score = score;

}

}

其他

import java.util.ArrayList;

import java.util.List;

/**

* 泛型没有多态

* 泛型没有数组

* JDK1.7对泛型的简化

* @author Administrator

*

*/

public class Demo06 {

public static void main(String[] args) {

Fruit fruit = new Apple(); // 多态,父类的引用指向子类的对象

//List list = new ArrayList(); //泛型没有多态

List extends Fruit> list = new ArrayList();

//泛型没有数组

//Fruit[] fruits = new Fruit[10];

//ArrayList底层是一个Object[],它放数据的时候直接放,取数据的时候强制类型转化为泛型类型

/*public boolean add(E e) {

ensureCapacityInternal(size + 1); // Increments modCount!!

elementData[size++] = e;

return true;

}*/

/*E elementData(int index) {

return (E) elementData[index];

}*/

//JDK1.7泛型的简化,1.6编译通不过

List list2 = new ArrayList<>();

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

花开的声音 - 张靓颖

姓名&#xff1a;张靓颖 / Jane Zhang性别&#xff1a;女 地区&#xff1a;内地 职业&#xff1a;歌手 星座&#xff1a;天秤座 血型&#xff1a;O 身高&#xff1a;162cm张靓颖&#xff0c;中国女歌手&#xff0c;四川成都人。2005年参加湖南卫视…

基于事件驱动架构构建微服务第5部分:容器化(Web Api Core 和 SQL Server Linux)

原文链接&#xff1a;https://logcorner.com/building-microservices-through-event-driven-architecture-part5-dockerization-web-api-core-and-sql-server-linux/在本文中&#xff0c;我将谈谈web api和sql server linux数据库的容器化Web API将发布并上线&#xff0c;它需要…

eclipse工程 'cocostudio/CocoStudio.h' file not found

android.mk里有这样配置&#xff1a; LOCAL_PATH : $(call my-dir)include $(CLEAR_VARS)$(call import-add-path,$(LOCAL_PATH)/../../cocos2d) $(call import-add-path,$(LOCAL_PATH)/../../cocos2d/external) $(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos) $(…

爆笑!物理书上的照片能不能好好选选啊喂!

全世界只有3.14 % 的人关注了爆炸吧知识在物理书里&#xff0c;有各种物理大佬的照片。他们正襟危坐&#xff0c;他们不苟言笑&#xff0c;他们看起来就很“物理”。但是&#xff0c;知识君想说&#xff0c;谁不是个有血有肉的人啊&#xff1f;&#xff01;选照片的时候给我好好…

java字符数组转化为字符串_java字符数组转字符串,java数组转字符串

字符串转数组使用Java split() 方法split() 方法根据匹配给定的正则表达式来拆分字符串。注意&#xff1a; . 、 | 和 * 等转义字符&#xff0c;必须得加 \\。多个分隔符&#xff0c;可以用 | 作为连字符。// 字符串转数组 java.lang.StringString str "0,1,2,3,4,5"…

计算机网络体系结构概述

1.Internet结构 2.计算机网络的体系结构 1&#xff09;网路协议主要由以下三要素组成&#xff1a; 语法&#xff0c;即数据与控制信息的结构或格式&#xff1b; 语义&#xff0c;即需要发出何种控制信息&#xff0c;完成何种动作以及做出何种响应&#xff1b; 同步&#xff0c;…

如何识别是三层交换机还是二层交换机

举例说明:302620125012看第2位是0~4的说明它是2层交换机3550看第2位是5~9的说明它是3层交换机LI(LitesoftwareImage)表示设备为弱特性版本。SI(StandardsoftwareImage)表示设备为标准版本&#xff0c;包含基础特性。 EI(EnhancedsoftwareImage)表示设备为增强版本&#xff0c;包…

.NET 6 全新指标 System.Diagnostics.Metrics 介绍

前言工友们, .NET 6 Preview 7 已经在8月10号发布了, 除了众多的功能更新和性能改进之外, 在 preview 7 版本中, 也新增了全新的指标API, System.Diagnostics.Metrics, 为了让应用能有更好的可观测性, 在之前的发布的.NET 5中, 也把 Activity 增强为 ActivitySource, 主要原因还…

java实验3_Java 实验3

实验3 /* * (#)AverageNumbers2 * * Copyright 2008 School of Software, Yunnan University. * All rights reserved */ package cn.edu.ynu.sei.Java_Labs.Lab3; /** * 求1&#xff0d;50的平均数 * version 1.0.0.0 Jan 22, 2008 …

42张动图带你走进神奇的物理世界,超震撼!

全世界只有3.14 % 的人关注了爆炸吧知识世界之大&#xff0c;无奇不有。生活中其实有许多神奇的物理化学现象。下面就一起来看看吧&#xff01;图片加载慢稍加等待即可哦~神 奇 的 物 理 反 应1.锤击被液氮冻上的康乃馨&#xff0c;求康乃馨的心理阴影面积。2.比重比空气还大的…

Linux优化之IO子系统监控与调优

Linux优化之IO子系统作为服务器主机来讲&#xff0c;最大的两个IO类型 &#xff1a;1.磁盘IO 2.网络IO这是我们调整最多的两个部分所在磁盘IO是如何实现的在内存调优中&#xff0c;一直在讲到为了加速性能&#xff0c;linux内核一般情况下都会尝试将磁盘上的慢速设备上的文件缓…

window 2008 和 windows vista windows 7 安装 MSMQ

从MSDN找到的资料&#xff0c;详见&#xff1a;http://msdn.microsoft.com/zh-cn/library/aa967729.aspx安装“消息队列 (MSMQ)”以下过程介绍如何安装“消息队列 4.0”和“消息队列 3.0”。 注意: 消息队列 4.0 在 Windows XP 和 Windows Server 2003 中不可用。 在 Windows S…

Oh no no no i'm a rocket man

She packed my bags last night pre-flight火箭队员昨晚整理行李准备打客场 Zero hour nine a.m.9分钟之前是午夜12点 And im gonna be high as a kite by then我象风筝那样跟向前 I miss the earth so much i miss my wife我曾错过这么多客场随队旅行的机会我错过了亲眼目睹火…

如何洗牌 ListT 中的元素?

咨询区 mirezus&#xff1a;是否有一个最佳的方式对 List<T> 进行洗牌排序&#xff0c;我的项目有一个抽奖模块&#xff0c;需要对一个有 75个元素的 List<T> 进行随机排序&#xff0c;请问大家有什么好的实现方式。回答区 user453230&#xff1a;如果你仅仅是想对…

用3年时间破解学界200多年难题,年仅21岁的天才竟因谈了一场恋爱挂掉了.........

全世界只有3.14 % 的人关注了爆炸吧知识俗话说&#xff0c;英雄难过美人关&#xff0c;即便是智商超群的数学天才也毫不例外。破得了百年的世界难题&#xff0c;却解不开一个小小的爱情谜团......没错&#xff0c;这位为情所困的数学天才&#xff0c;便是今天的主人公——伽罗瓦…

投影变换与视口变换

一些说明&#xff1a; 0. 投影变换&#xff1a;描述如何指定视景体(viewing volume)的形状和方向。视口变换&#xff1a;解释如何控制三维模型坐标到屏幕坐标的变换。 1. 无论是透视投影还是平行投影&#xff08;正交投影&#xff09;&#xff0c;只有在视景体中的物体才可见。…

java 按钮设置图片_Java中如何设置带图片按钮的大小

在java部分需要用到图形界面编程的项目中&#xff0c;经常会使用图片设置对按钮进行美化&#xff0c;但是使用时会出现一个很麻烦的问题&#xff0c; 按照方法&#xff1a;JButton jb1 new JButton();jb1.setBounds(0, 0, 25, 20);ImageIcon ii new ImageIcon("images/x…

JAVA 异常库

为什么80%的码农都做不了架构师&#xff1f;>>> 1.java.lang.NumberFormatException: multiple points已解决 多线程方法中使用了共享变量SimpleDateFormat&#xff0c;报如下错误&#xff1a; java.lang.NumberFormatException: multiple points at sun.misc.Floa…

WPF ComboBox 使用 ResourceBinding 动态绑定资源键并支持语言切换

WPF ComboBox 使用 ResourceBinding 动态绑定资源键并支持语言切换独立观察员 2021 年 8 月 23 日我们平常在 WPF 中进行资源绑定操作&#xff0c;一般就是用 StaticResource 或者 DynamicResource 后面跟上资源的 key 这种形式&#xff0c;能满足大部分需求。但是有的时候&am…

2009年最佳80后科技创业者

近日&#xff0c;《商业周刊》公布了2009年最有前途的科技初创公司及青年创业者名单&#xff0c;这些企业创始人年龄都在30岁及以下。商业周刊表示&#xff0c;从这些创业公司来看&#xff0c;创新依然存在并发展良好。以下为其详细名单&#xff0c;包括入选初创的业务描述以及…