1.Generic概念

public static void main(String[] args) {
//Generic
List<String> l = new ArrayList<String>();
List<Integer> sl = Collections.synchronizedList(new ArrayList<Integer>());
l.add("aa");
sl.add(8);
//sl.add("8");泛型报错
System.out.println("List<String>" + l);
System.out.println("List<Integer>" + sl); //Generic 简写
Map<String, Float> sm = Collections.synchronizedMap(new HashMap<>());
sm.put("Hello", 1f);
System.out.println("sm" + sm);
Map<Double, List<String>> smm = Collections.synchronizedMap(new HashMap<>());
smm.put(2.0, l);
//smm.putAll(2.0, sl);泛型报错
}

2.泛型类

2.1定义泛型类

定义泛型:

class 类名<声明自定义泛型>{

    }  

注意要点

  • 在类上自定义泛型,具体数据类型在使用该类创建对象时候确定的
  • 如果一个类在声明中指定了自定义泛型,如果使用该类创建对象时候没有指定具体的泛型数据类型,默认为Object
  • 在类上自定义泛型不能作用于静态方法,如果静态方法需要使用自定义泛型,需要在方法上声明:static void funStatic(T t){}
package com.company.project.generictext;

//GenericApple.java
public class GenericApple<T> {
private T tInfo;
//构造
public GenericApple(){}
public GenericApple(T tInfo){
this.tInfo = tInfo;
} //getter & setter
public T gettInfo() {
return tInfo;
}
public void settInfo(T tInfo) {
this.tInfo = tInfo;
}
}
package com.company.project.generictext;
//GenericApplePrint.java
public class GenericApplePrint { public static void main(String[] args) {
// TODO Auto-generated method stub
//传入给T形参是String,所以构造只能为String
GenericApple<String> gaString = new GenericApple<>("asdf");
System.out.println(gaString.gettInfo());
//传入给T形参是Integer,所以构造只能为Integer
GenericApple<Integer> gaInteger = new GenericApple<>(6);
System.out.println(gaInteger.gettInfo());
} }

2.2泛型类的继承

package com.company.project.generictext;
//GenericAppleSubClass
public class GenericAppleSubClass extends GenericApple<String> { }

2.3类型通配符

如果要定义一个通用的泛型子类,那么在继承中子类并不是父类的子类型,而数组是:

package com.company.project.upper;
//Shape.java
public abstract class Shape {
public abstract void draw(Canvas c);
}
package com.company.project.upper;
//Circle.java
public class Circle extends Shape { @Override
public void draw(Canvas c) {
// TODO Auto-generated method stub
System.out.println("draw a circle on the canvas.");
package com.company.project.upper;
//Canvas.java
import java.util.List; public class Canvas {
public void drawAll(List<? extends Shape> Shapes){
for (Shape s : Shapes) {
s.draw(this);
}//for
}
}
package com.company.project.upper;
//UpperPrint.java
import java.util.ArrayList;
import java.util.List; public class UpperPrint { public static void main(String[] args) {
// TODO Auto-generated method stub
List<Circle> l = new ArrayList<>();
Canvas c = new Canvas();
Circle ci = new Circle();
l.add(ci);
c.drawAll(l);
} }

2.4设置类型形参上下限

要使用泛型通配符‘?’,并且这个通配符不会单独使用:

上限

////只存储Integer和Integer的子类
void Fun1(Collection <? extends Integer> c){ }

下限

//只存储Integer和Integer的父类
void Fun2(Collection <? super Integer> c){ }

2.5泛型接口

定义方法

interface 接口名称<自定义泛型>{

}  

注意要点

  • 接口上实现自定义泛型,具体数据类型是在 实现一个接口时候指定的
  • 在接口上自定义泛型,如果在实现接口时候没有指定具体数据类型,那么默认为Object
  • 如果要延长接口自定义泛型,那么类如下
class MyClass<T> implements MyInterface<T>{

}  

3.泛型方法

package com.company.project.generictext;

import java.util.Collection;
//GenericMethod。java
public class GenericMethod {
//GM-1
static void fromArryaToCollection1(Object[] o, Collection<Object> c){
for (Object oo : c) {
c.add(oo);
}
} //GM-2
//GenericMethod的:修饰符 <T> 返回类型 方法名称(形参表)
static <T> void fromArrayToCollection2(T[] t, Collection<T> c){
for (T t2 : c) {
c.add(t2);
}
} //错误的拷贝
static <T> void fromArrayToCollection3(Collection<T> from, Collection<T> to){
for (T t : from) {
//这里程序不识别
to.add(t);
}
} //要用继承去拷贝
static <T> void fromArrayToCollection4(Collection<? extends T> from, Collection<T> to){
for (T t : from) {
//这里程序不识别
to.add(t);
}
}
}
public static void main(String[] args) {
/*GM-1 print*/
String[] s = {"1", "a"};
HashSet<String> hs = new HashSet<>();
GenericMethod gm = new GenericMethod();
//Collection<String>不是Collection<Object>的子类,这里会编译错误
gm.fromArryaToCollection1(s, hs); /*GM-2 print*/
Collection<String> cs = new HashSet<>();
//这里的T表示String
gm.fromArrayToCollection2(s, cs);
Integer[] i = new Integer[10];
Collection<Number> cn = new ArrayList<>();
//这里的T表示Number
gm.fromArrayToCollection2(i, cn); }

4.类型通配符和泛型方法的区别

大多数时候都可以泛型方法替换类型通配符,如Java中:

5.设置类型通配符的下限

6.擦除和转换

泛型只在编译期间有效,运行时候是没有泛型的。

//这两个函数是重载,可以
public void Fun(Person p){
}
public void Fun(Emplooe p){
} //这里会报错!因为编译后是同样的函数名称和入参
public void Fun(List<Person> p){
}
public void Fun(List<Emplooe> p){
}

7.泛型和数组

17.泛型.md的更多相关文章

  1. Java 集合、Iterator迭代器、泛型等

    01集合使用的回顾 A:集合使用的回顾 a.ArrayList集合存储5个int类型元素 public static void main(String[] args) { ArrayList<I ...

  2. 18_集合框架_第18天_集合、Iterator迭代器、增强for循环 、泛型_讲义

    今日内容介绍 1.集合 2.Iterator迭代器 3.增强for循环 4.泛型 01集合使用的回顾 *A:集合使用的回顾 *a.ArrayList集合存储5个int类型元素 public stati ...

  3. Java 高效编程(Effective Java)中文第三版(补档)

    来源:sjsdfg/effective-java-3rd-chinese <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过, ...

  4. 计算机专业-世界大学学术排名,QS排名,U.S.NEWS排名

    2015年美国大学计算机专业排名 计算机专业介绍:计算机涉及的领域非常广泛,其分支学科也是非常多.所以在美国将主要的专业方向分为人工智能,程序应用,计算机系统(Systems)以及计算机理论(theo ...

  5. JavaSE学习总结第16天_集合框架2

      16.01 ArrayList存储字符串并遍历 ArrayList类概述:底层数据结构是数组,查询快,增删慢,线程不安全,效率高 ArrayList类是List 接口的大小可变数组的实现.实现了所 ...

  6. Linux(2)文件和权限

    用户目录 位于/home/user, 称为用户目录或家目录, 表示方法: /home/user ~ 相对路径和绝对路径 绝对路径 从 / 目录开始描述的路径外绝对路径 cd /home cd /usr ...

  7. NandFlash学习

    目录 NandFlash学习 概述 原理图(K9F2G08U0C) 启动的引脚配置 命令概述 操作概述 Uboot下操作体验 ID与地址编码 时序初始化 程序设计 忙判断 基本操作 读NAND 擦除 ...

  8. scala面向对象.高阶函数,柯里化,Actor编程简介

    1.定义一个类 class Person{ //用val修饰的变量是只读属性,有getter但是没有setter val id ="111" //用var修饰的变量既有getter ...

  9. 18_java之集合Collection

    01集合使用的回顾 *A:集合使用的回顾 *a.ArrayList集合存储5个int类型元素 public static void main(String[] args) { ArrayList< ...

随机推荐

  1. VMware安装CentOS7踩坑

      1.VMware安装Centos7加载界面不显示,但有快照 单击“开始”,运行中输入cmd. 然后输入命令 netsh winsock reset. 重启计算机. 2.nat模式网络问题     ...

  2. SSH 项目整合

    SSH整合:spring + springmvc + hibernate 1.1 生成Maven项目:ar_ssh 1.2 添加jar包:pom.xml 与ssm相比,主要添加了spring与hibe ...

  3. 本地IP,掩码,网关,DNS设置

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. 我推荐阅读的微信公众号-IT类

    微信,正深刻影响着我们的生活,每个使用微信的人,从微信这个窗口去了解这个世界. 微信公众号,微信生态圈是核心功能之一,每天都有大量的文章创作.传播.转发出来,海量的信息扑面而来,微信阅读成为微信使用者 ...

  5. useful tools and website

    1.https://www.processon.com/   在线流程图制作网站 2.http://www.easyicon.net/  专门下载图标的网站 3.https://www.lfd.uci ...

  6. ViewPager的addOnPageChangeListener和setOnPageChangeListener的区别,ViewPager改变数据后IndexOutOfBoundsException

    我的ViewPager数据改变后,在切换界面刷新数据时:OnPageChangeListener中的数据IndexOutOfBoundsException,我们来看源码探一下究竟: 代码时这样写的: ...

  7. Django跨域问题

    相关博客地址 同源策略与Jsonp 同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可 ...

  8. CSS 随笔

    1.动态修改div的大小 Html: <div> Hello </div> css: div { resize:both; overflow:auto; } 2. box-si ...

  9. 元组,列表的增删改查, for,range 循环

    1. list(增删改查) 列表可以装大量的数据. 不限制数据类型. 表示方式:[] 方括号中的每一项用逗号隔开 列表和字符串一样.也有索引和切片 常用的功能: 1. 增: append() 2. 删 ...

  10. linux下部署jdk+Tomcat

    部署jdk (如果是普通用户,先切换到管理员 su root) 1.下载jdk压缩包 2.用xftp将jdk压缩包传输 /opt 目录下 3.解压(在/opt 目录下对压缩包解压) tar -xzvf ...