泛型

泛型:是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型,参数化类型,把类型当做参数一样的传递

好处:

1)把运行时期的问题提前到了编译器期间

2)避免了强制类型转换

3)优化了程序设计,解决了黄色警告线

例1:用ArrayList存储字符串元素,并遍历,用泛型改进

import java.util.ArrayList;
import java.util.Iterator;
public class ArrayListDemo1{
public static void main(String[] args){
ArrayList<String> a1=new ArrayList<String>();
a1.add("hadoop");
a1.add("spark");
a1.add("storm"); Iterator<String> it = a1.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
} System.out.println("----------------for--------------------");
for(int i=0;i<a1.size();i++){
String s = a1.get(i);
System.out.println(s);
}
}
} --------------------------------------------------------
输出结果
hadoop
spark
storm
---------------for----------------------------
hadoop
spark
storm
---------------------------------------------

例2:用ArrayList存储自定义对象,并遍历,用泛型改进

import java.util.ArrayList;
import java.util.Iterator;
public class ArrayListDemo2{
public static void main(String[] args){
ArrayList<Student> a1 = new ArrayList<Student>(); Student s1 = new Student("wu",24);
Student s2 = new Student("sun",25);
Student s3 = new Student("xu",26); a1.add(s1);
a1.add(s2);
a1.add(s3); Iterator<Student> it=a1.iterator();
while(it.hasNext()){
Student s = it.next();
System.out.println(s);
} System.out.println("---------for----------------------");
for(int i=0;i<a1.size();i++){
System.out.println(a1.get(i));
}
}
} class Student{
private int age;
private String name; //构造方法
public Student(){
super();
} public Student(String name,int age){
this.name = name;
this.age = age;
} public void setName(String name){
this.name = name;
} public String getName(){
return name;
} public void age(int age){
this.age = age;
} public int age(){
return age;
} public String toString(){
return "Student [name="+name+",age="+age+"]";
}
} --------------------------------------------
输出结果
Student [name=wu,age=24]
Student [name=sun,age=25]
Student [name=xu,age=26]
---------for----------------------
Student [name=wu,age=24]
Student [name=sun,age=25]
Student [name=xu,age=26]
  • 泛型类

把泛型定义在类上

格式:public class 类名<泛型类型1,...>

注意:泛型类型必须是引用类型

public class ObjectToolDemo{
public static void main(String[] args){
/*
ObjectTool ot = new ObjectTool();
ot.setObj(new String("wujiadong"));
String s =(String) ot.getObj();
System.out.println(s); ot.setObj(new Integer(30));
Integer i=(Integer) ot.getObj();
System.out.println(i);
*/ ObjectTool<String> ot1 = new ObjectTool<String>();
ot1.setObj(new String("wujiadong"));
String s = ot1.getObj();
System.out.println(s); ObjectTool<Integer> ot2 = new ObjectTool<Integer>();
ot2.setObj(new Integer(2));
Integer i = ot2.getObj();
System.out.println(i); }
} /*
*泛型类:把泛型定义在类上
*/
class ObjectTool<T> {
private T obj; public T getObj(){
return obj;
} public void setObj(T obj){
this.obj = obj;
}
} -------------------------------------------
输出结果
wujiadong
2
----------------------------------------------
  • 泛型方法

把泛型定义在方法上

格式:public <泛型类型> 返回类型 方法名(泛型类型){}

前示例:

public class ObjectToolDemo1{
public static void main(String[] args){
/*
ObjectTool ot = new ObjectTool();
ot.show("wujiadong");
ot.show(10);
ot.show(true);
*/
ObjectTool<String> ot1 = new ObjectTool<String>();
ot1.show("wujiadong"); ObjectTool<Integer> ot2 = new ObjectTool<Integer>();
ot2.show(20); ObjectTool<Boolean> ot3 = new ObjectTool<Boolean>();
//大写的Boolean,小写的boolean是基本数据类型,而这里只能是引用数据类型
ot3.show(true); }
} class ObjectTool<T>{
/*
public void show(String s){
System.out.println(s);
} public void show(Integer i){
System.out.println(i);
} public void show(Boolean b){
System.out.println(b);
}
*/ public void show(T t){
System.out.println(t);
}
} ------------------------------------------ 输出结果
wujiadong
20
true
-----------------------------------------

泛型方法示例

public class ObjectToolDemo1{
public static void main(String[] args){ ObjectTool ot = new ObjectTool();
ot.show("wujiadong");
ot.show(10);
ot.show(true); /*
ObjectTool<String> ot1 = new ObjectTool<String>();
ot1.show("wujiadong"); ObjectTool<Integer> ot2 = new ObjectTool<Integer>();
ot2.show(20); ObjectTool<Boolean> ot3 = new ObjectTool<Boolean>();
//大写的Boolean,小写的boolean是基本数据类型,而这里只能是引用数据类型
ot3.show(true);
*/
}
} class ObjectTool{
/*
public void show(String s){
System.out.println(s);
} public void show(Integer i){
System.out.println(i);
} public void show(Boolean b){
System.out.println(b);
}
*/ public <T>void show(T t){
System.out.println(t);
}
} --------------------------------------
输出结果
wujiadong
10
true
---------------------------------------
  • 泛型接口

把泛型定义在接口上

格式:public interface 接口名<泛型类型1,...>

//接口
interface Inter<T>{
public abstract void show(T t);//接口中抽象方法无方法体 } //实现接口
//实现类实现接口分两种情况:
//第一:已经知道是什么类型
//第二:不知奥是什么类型
class InterImp1 implements Inter<String>{
public void show(String t){
System.out.println(t);
} } public class InterDemo{
public static void main(String[] args){
//InterImp1 i = new InterImp1();
Inter<String> i = new InterImp1();
i.show("wujiadong"); }
}
-------------------------------------------
输出结果
wujiadong
-------------------------------------------

第二种情况(常用)

//接口
interface Inter<T>{
public abstract void show(T t);//接口中抽象方法无方法体 } //实现接口
//实现类实现接口分两种情况:
//第二:不知奥是什么类型
class InterImp1<T> implements Inter<T>{
public void show(T t){
System.out.println(t);
} } public class InterDemo{
public static void main(String[] args){
//InterImp1 i = new InterImp1();
Inter<String> i = new InterImp1<String>();
i.show("wujiadong"); Inter<Integer> i1 = new InterImp1<Integer>();
i1.show(10); Inter<Boolean> i2 = new InterImp1<Boolean>();
i2.show(true);
}
} ----------------------------------------------
输出结果
wujiadong
10
true

泛型高级(通配符)

1)泛型通配符<?>

  • 任意类型,如果没有明确,那么就是Object以及任意的java类了

2)?extend E

  • 向下限定,E及其子类

3)?super E

  • 向上限定,E及其父类

举例说明

import java.util.Collection;
import java.util.ArrayList;
class Animal{ } class Dog extends Animal{ } class Cat extends Animal{ } public class GenericDemo{
public static void main(String[] args){
//泛型如果明确的写的时候,前后必须一致
// Collection<Object> c = new ArrayList<Animal>();错误的写法 //?表示任意的类型都是可以的
Collection<?> c1 = new ArrayList<Object>();
Collection<?> c2 = new ArrayList<Animal>();
Collection<?> c3 = new ArrayList<Dog>();
Collection<?> c4 = new ArrayList<Cat>(); //?extends E 向下限定,E及其子类
//Collection<? extends Animal> c5 = new ArrayList<Object>();报错
Collection<? extends Animal> c5 = new ArrayList<Animal>();
Collection<? extends Animal> c6 = new ArrayList<Dog>();
Collection<? extends Animal> c7 = new ArrayList<Cat>(); //?super E 向上限定,E及其父类
Collection<? super Animal> c8 = new ArrayList<Object>();
Collection<? super Animal> c9 = new ArrayList<Animal>();
//Collection<? super Animal> c10 = new ArrayList<Dog>();
//Collection<? super Animal> c11 = new ArrayList<Cat>();
}
}

java基础(6)-集合类2的更多相关文章

  1. java基础(8) -集合类-Collecion

    集合类-Collecion Collection接口 常用方法 //添加新元素 boolean add (E element); //返回迭代器 Iterator<E> iterator( ...

  2. 面试【JAVA基础】集合类

    1.ArrayList的扩容机制 每次扩容是原来容量的1.5倍,通过移位的方法实现. 使用copyOf的方式进行扩容. 扩容算法是首先获取到扩容前容器的大小.然后通过oldCapacity (oldC ...

  3. 【java基础之jdk源码】集合类

    最近在整理JAVA 基础知识,从jdk源码入手,今天就jdk中 java.util包下集合类进行理解 先看图 从类图结构可以了解 java.util包下的2个大类: 1.Collecton:可以理解为 ...

  4. Java基础__Java中自定义集合类

    Java基础__Java中集合类 传送门 自定义MyArrayList集合实现:增加数据.取数据.查看集合中数据个数方法 package com.Gary; public class MyArrayL ...

  5. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  6. 【JAVA面试题系列一】面试题总汇--JAVA基础部分

    JAVA基础 基础部分的顺序: 基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 每天几道,持续更新!! 1.一个". ...

  7. Java基础知识【下】( 转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608360 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  8. Java基础应用

    Java集合类解析 List.Map.Set三个接口,存取元素时,各有什么特点? List 以特定次序来持有元素,可有重复元素.Set 无法拥有重复元素,内部排序.Map 保存key-value值,v ...

  9. Java基础知识学习(一)

    部门接了新项目,后台使用Java框架play framework,前端是html,前后台通过rest交互,能够支持多端的互联网架构. 因为之前没有Java基础,前端使用的也很少,决定深入学习一下Jav ...

  10. java基础要点

    Java语言是现在比较常用的编程语言,因为Java语言可以编写桌用程序,也可以编写web程序,还能编写嵌入式程序.这是由于相比脚本语言,Java 的运行速度要快.而对于底层语言,Java与平台无关,可 ...

随机推荐

  1. Mongo同步数据到Elasticsearch

    个人博客:https://blog.sharedata.info/ 最近需要把数据从Mongo同步到Elasticsearch环境:centos6.5python2.7pipmongo-connect ...

  2. 错误命令“if not exist "\Dll" mkdir "\Dll" xcopy "\bin\Debug\*.*" "F:\647\VS项目\EtrolMes2014SY\Framework\Dll" /e /i /y”已退出,代码为 9009

    分析错误 第一步:观察错误,发现plugin文件夹中未生成对应的编译文件. 第二步:XCOPY命令无法执行,百度xcopy为何无法执行 第三步,搜索,发现环境变量未配置正确. 就是环境变量path(大 ...

  3. eclipse下设置tomcat,修改Java代码不必重启tomcat

    1.本文目的:用tomcat进行web开发时,修改Java代码往往要重启代码,当工程较大启动较慢时,严重影响效率,本文通过eclipse下tomcat开发和发布web程序时,对一些Java代码一般修改 ...

  4. 任务05—学习 MARKDOWN 语言

    我的简历地址: https://github.com/jinxiaohang/MyResume/blob/master/ForJavaJob.md 本任务主要目的掌握markdown. 1.首先是工具 ...

  5. Grunt自动化工具相关

    Grunt 项目中安装grunt模块npm install grunt --save,删除模块 npm uninstall grunt ,缺失某个插件:npm install grunt-contri ...

  6. Vue中使用定时器setInterval和setTimeout

    js中定时器有两种,一个是循环执行setInterval,另一个是定时执行setTimeout 一.循环执行(setInterval) 顾名思义,循环执行就是设置一个时间间隔,每过一段时间都会执行一次 ...

  7. 内置函数:max 用法

    内置函数——max Python max内置函数 max(iterable, *[, key, default]) max(arg1, arg2, *args[, key]) Return the l ...

  8. Linux介绍和基本命令

    Linux是什么? 就是运行在硬件之上的一组软件,主要控制内核和系统调用这2个层面为上层应用软件提供各种接口,并高效的控制硬件资源,与window一样是一种操作系统 Linux的创始人是林纳斯-托瓦兹 ...

  9. 我的Android进阶之旅------>Android项目运行报java.lang.NoClassDefFoundError错误的解决办法

    今天在运行一个Android项目的时候,报了以下错误: D/AndroidRuntime( 3859): Shutting down VM E/AndroidRuntime( 3859): FATAL ...

  10. git原理:提交原理

    当运行git add  git commit的时候,git底层都做了什么? 这里涉及到的底层命令:git hash-object 讲对象写入到git object中git update-index   ...