JAVA高级--java泛型
类型的参数化
- 泛型类可以同时设置多个参数
- 泛型类可以继承泛型类
- 泛型类可以实现泛型接口
示例--泛型类
package com.date;
public class GenericDemo {
public static void main(String[] args) {
GenClass<String> genClass=new GenClass<String>("tanlei");
System.out.println(genClass.getData());
GenClass<Integer> genClass2=new GenClass<Integer>(100);
System.out.println(genClass2.getData());
}
}
//创建一个泛型类
class GenClass<T>{
private T data;
public GenClass(T data) {
this.data = data;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
- 泛型类可以同时设置多个参数
package com.date;
public class GenericDemo {
public static void main(String[] args) {
Genclass2<String,Integer> genclass2=new Genclass2("tanlei", 100);
System.out.println(genclass2.getData1());
System.out.println(genclass2.getData2());
}
}
class Genclass2<T1,T2>{
private T1 data1;
private T2 data2;
public Genclass2(T1 data1, T2 data2) {
this.data1 = data1;
this.data2 = data2;
}
public T1 getData1() {
return data1;
}
public void setData1(T1 data1) {
this.data1 = data1;
}
public T2 getData2() {
return data2;
}
public void setData2(T2 data2) {
this.data2 = data2;
}
}
- 泛型类可以继承泛型类
package com.date;
public class Grneric {
public static void main(String[] args) {
subClass<String,Integer> subClass=new subClass("xiaotan", 22);
System.out.println(subClass.Show1());
subClass.show2(22);
}
}
interface Iinfo<T2>{
public void show2(T2 var2) ;
}
class superClass<T1>{
private T1 var1;
public superClass(T1 var1) {
this.var1 = var1;
}
public T1 Show1() {
return var1;
}
}
class subClass<T1,T2> extends superClass<T1> implements Iinfo<T2>{
private T2 var2;
public subClass(T1 var1,T2 var2) {
super(var1);
this.var2=var2;
}
public T1 Show1() {
return super.Show1();
}
public void show2(T2 var3) {
System.out.println(var3);
System.out.println(var2);
}
}
限制泛型可用类型
可以在定义类型时,使用extends关键字指定这个类型必须继承某个类,或者实现某个接口
package com.date;
public class Extends_InterfaceDemo {
public static void main(String[] args) {
GenericClass<Dog> dogclass=new GenericClass<Dog>();
dogclass.setObj(new Dog());
dogclass.getObj().eat();
GenericClass<Cat> catclass=new GenericClass<Cat>();
catclass.setObj(new Cat());
catclass.getObj().eat();
}
}
//只能接受Animal类型或者Animal类的子类类型
class GenericClass<T extends Animal>{
private T obj;
public T getObj() {
return obj;
}
public void setObj(T obj) {
this.obj = obj;
}
}
abstract class Animal{
public abstract void eat();
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗啃骨头");
}
}
class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
类型通配声明
泛型通配的方式
"?"代表任意一个类型

泛型方法
访问修饰符 <泛型列表> 返回类型 方法名(参数列表){
实现代码
}
什么时候用到泛型方法,而不是泛型类呢?
添加类型约束只作用于一个方法的多个参数之间,而不涉及到类中的其他方法
public class Extends_InterfaceDemo {
public static void main(String[] args) {
GenericClass gen=new GenericClass();
gen.println("ABC");
gen.println(true);
gen.println(10);
gen.println(10.8);
gen.println(new Dog());
GenericClass.print("haha");
}
}
class GenericClass{
//泛型方法
public<T> void println(T content) {
System.out.println(content);
}
//泛型方法的重载
public<T extends Animal> void println(T animal) {
animal.eat();
}
public static <T> void print(T content) {
System.out.println(content);
}
}
案例讲解
自定义一个存放指定数据的容器
package com.day1;
import java.util.Arrays;
public class ArrayListDemo {
public static void main(String[] args) {
IContainer<String> list=new Container<String>();
for (int i = 0; i < 12; i++) {
list.add("data:"+(i+1));
}
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
interface IContainer<T>{
public void add(T obj);//给容器添加数据
public T get(int index);//根据下标 获取指定位置的元素内容
public int size();//返回容器中元素的个数
}
class Container<T> implements IContainer<T>{
// private T[] data=new T[10];//错误,不能参加泛型数组,无法知道数据类型
private Object [] data=null;
private int size=0;//记录容器元素的个数
public Container() {
data=new Object[10];//初始大小为10
}
public Container(int capacity) {
data=new Object[capacity];//
}
@Override
public void add(T obj) {
//判断元素的个数是否超过容器的大小,超过了对容器进行扩容
ensureCapacity(size+1);
data[size++]=obj;//添加元素
}
private void ensureCapacity(int i) {
if(i>data.length) {
int oldi=data.length;
int newi=oldi+(oldi>>1);//扩容为原有容量的1.5倍
data=Arrays.copyOf(data, newi);//将原有数组中的数据拷贝到新创建的数组中
}
}
@Override
public T get(int index) {
return (T)data[index];
}
@Override
public int size() {
return size;
}
}
@SuppressWarnings("unchecked") 去掉黄色警告
JAVA高级--java泛型的更多相关文章
- 从一知半解到揭晓Java高级语法—泛型
目录 前言 探讨 泛型解决了什么问题? 扩展 引入泛型 什么是泛型? 泛型类 泛型接口 泛型方法 类型擦除 擦除的问题 边界 通配符 上界通配符 下界通配符 通配符和向上转型 泛型约束 实践总结 泛型 ...
- java高级---->Java动态代理的原理
Java动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程 ...
- java高级---->Java观察者的原理
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己.今天我们通过模拟按钮的处理事件来深入Java ...
- java高级 - java利用listener实现回调,即观察者模式
https://blog.csdn.net/lin_sir6/article/details/70052954
- 黑马程序员:Java基础总结----泛型(高级)
黑马程序员:Java基础总结 泛型(高级) ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...
- JAVA 高级特性枚举和泛型
枚举: 语法: public enum 枚举名 { 枚举值表(罗列所有值) } 例如: public enum EnumTest{MON,TUE,WED.THU,FRI,SAT,SUN} 枚举操 ...
- [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...
- paip.java 架构师之路以及java高级技术
paip.java 架构师之路以及java高级技术 1. Annotation 设计模式... 概念满天飞.ORM,IOC,AOP. Validator lambda4j memcache. 对 ...
- Java高级之类结构的认识
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! Java体系包括,各种版本的虚拟机,可执行文件,各种第三方类库,Java API类库,Java语言 ...
随机推荐
- Cesium官方教程4--影像图层
原文地址:https://cesiumjs.org/tutorials/Imagery-Layers-Tutorial/ 影像图层 Cesium支持多种服务来源的高精度影像(地图)数据的加载和渲染.图 ...
- java 在线拆分 word文档采用什么技术比较好?
在Java项目开发中,偶尔会遇到通过程序动态拆分word文档的需求,由于Java本身不能操作Word文档,在网上也都是讨论如何动态合并word,所以这个需求实现起来相当困难,下面就将近期对于Word文 ...
- java 异常捕获小记
java 中异常捕获常用的为: try{ //业务代码 }catch(Exception e){ //异常捕获 }finally{ // 不管有无异常, 最后都会执行到这里 } 在方法体内如果想要把异 ...
- 提高scrapy的抓取效率
增加并发 默认scrapy开启的并发线程的个数是32个,可以适当的进行增加.在settings中进行设置CONCURRENT_REQUESTS=100 降低日志级别 在运行的时候,会有大量的日志信息的 ...
- 2019-1-29-dotnet-使用-Qpush-快速从电脑到手机推送文字
title author date CreateTime categories dotnet 使用 Qpush 快速从电脑到手机推送文字 lindexi 2019-01-29 16:22:56 +08 ...
- copyTo和clone的区别/制作mask的fillpoly函数(有问题)
OpenCV中mat::copyto( )函数使用方法 OpenCV的fillPoly函数 使用OpenCV库进行图像处理时,经常会用到clone和copyTo函数,这里对两个函数进行介绍. copy ...
- Echarts 的简单使用
http://echarts.baidu.com/index.html 直接用script引入从官网下载的echarts.js文件 官网的文件有几种版本的,按需下载即可,注意精简版的只显示折线.圆柱等 ...
- MVVM 一种新型架构框架
MVVM是Model-View-ViewModel的简写.微软的WPF带来了新的技术体验,如Silverlight.音频.视频.3D.动画……,这导致了软件UI层更加细节化.可定制化.同时,在技术层面 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---装饰模式之StarBuzzCoffee[转]
1 2{<HeadFirst设计模式>之装饰模式 } 3{ 本单元中的类为被装饰者 } 4{ 编译工具: Delphi7.0 } 5{ E-Ma ...
- [jnhs]教训之jsp页面无法用jstl取值的坑.真他妈的奇葩,实体类的属性名不能用大写
结果页面永远都是空 调试发现,数据正常的塞进去了 问题解决: https://zhidao.baidu.com/question/570584436.html 实体类的属性名,首字母不能大写,改成小写 ...