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语言 ...
随机推荐
- 深喉起底APP线下预装市场,如何一夜间拥有千万用户
注:预装对于中国的移动互联网创业者有多重要?i黑马知道这样一个内幕,某商务告诉我他们公司的前2000万用户就是靠预装打下来的,总部在北京,直接派驻商务长期扎根在深圳搞定手机厂商.而这家公司初期发展得益 ...
- 【MFC】MFC文本框中显示浮点数
CString strNumber; strNumber.Format("%0.2f",tim.getTimeMilli()); SetDlgItemText(IDC_TIME_U ...
- Python - 基本数据类型及其常用的方法之列表
列表: 特点:用 [] 括起来,切元素用逗号分隔:列表内的元素可以为任何的数据类型. 列表的基本操作: 1.修改 li = [12, 5, 6, ["Aiden", [2, 4], ...
- leetcode 699. Falling Squares 线段树的实现
线段树实现.很多细节值得品味 都在注释里面了 class SegTree: def __init__(self,N,query_fn,update_fn): self.tree=[0]*(2*N+2) ...
- Python list以及numpy处理技巧
1.numpy数组后面添加一个list: import numpy as np a=[[1,2,3],[4,5,6],[7,8,9]] box=np.array(a) box=np.vstack((b ...
- Leetcode415Add Strings字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: num1 和num2 的长度都小于 5100. num1 和num2 都只包含数字 0-9. num1 和num2 都不包 ...
- BigDecimal的四则运算及小数位数格式
一.加法 BigDecimal b1 = new BigDecimal("20");BigDecimal b2 = new BigDecimal("30");B ...
- ES6学习笔记之解构赋值
1.数组的解构赋值 简单用法 { // 旧 let a=1,b=3; //新 let [a,b]=[1,3]; console.log(a,b);// 1 3 } 只要等号两边的模式相同,左边的变量就 ...
- Vue-cli3.x在开发环境中(router采用 history模式)出现Failed to resolve async component default: Error: Loading chunk {/d} failed.或者Uncaught SyntaxError: Unexpected token <错误
使用Vue-cli3.x开发环境中(router采用 history模式)出现Failed to resolve async component default: Error: Loading chu ...
- uni-app开发微信小程序引入UI组件库(Vant-weapp)步骤
uni-app开发微信小程序引入UI组件库(Vant-weapp)步骤 这里以vant-weapp为例 uni-app官方文档介绍引入组件的方法 1. 新建相关目录 根目录下创建 wxcomponen ...