Java泛型的应用
一、泛型类
package generics;
/**
* 泛型类,格式:public class 类名<泛型类型1, ...>
* @author zhongfg
* @date 2015-06-16
* @param <T>
*/
class Student<T> { private T num; public T getNum() {
return num;
} public void setNum(T num) {
this.num = num;
} } public class GenericsClass {
public static void main(String[] args) { Student<String> s1 = new Student<String>();
s1.setNum("001");
String num1 = s1.getNum();
System.out.println(num1); System.out.println("----------------"); Student<Integer> s2 = new Student<Integer>();
s2.setNum(2);
int num2 = s2.getNum();
System.out.println(num2);
}
}
二、泛型方法
package generics;
/**
* 泛型方法,public <泛型类型> 返回值 方法名(泛型类型)
* @author zhongfg
* @date 2015-06-16
*/
class Actor { public <T> void show(T t){ System.out.println(t);
} } public class GenericsMethod { public static void main(String[] args) { Actor a = new Actor();
a.show("Angelababy");
a.show(26);
}
}
三、泛型接口
package generics;
/**
* 泛型类,格式:public interface 接口名<泛型类型1, ...>
* @author zhongfg
* @date 2015-06-16
* @param <T>
*/
interface Person<T> { public abstract void show(T t);
} class PersonImpl<T> implements Person<T> { @Override
public void show(T t) {
// TODO Auto-generated method stub
System.out.println(t);
}
} public class GenericsInterface {
public static void main(String[] args) { Person<String> p1 = new PersonImpl<String>();
p1.show("黄晓明"); Person<Integer> p2 = new PersonImpl<Integer>();
p2.show(38);
}
}
四、泛型高级之通配符
package generics; import java.util.ArrayList;
import java.util.Collection; /**
* 泛型高级(通配符)
* ?:任意类型,如果没有明确指定,那么就是Object或者任意的Java类了
* ? extends E:向下限定,E及其子类
* ? super E:向上限定,E及其父类
* @author zhongfg
* @date 2015-06-16
*/
class Animal { } class Dog extends Animal { } class Cat extends Animal { } public class GenericsWildcard {
public static void main(String[] args) { //明确指明泛型的时候,前后必须一致
Collection<Object> c1 = new ArrayList<Object>();
// Collection<Object> c2 = new ArrayList<Animal>(); 报错,前后类型不一致
// Collection<Object> c3 = new ArrayList<Dog>(); 同上
// Collection<Object> c4 = new ArrayList<Cat>(); 同上 //?表示任意类型都是可以的
Collection<?> c5 = new ArrayList<Object>();
Collection<?> c6 = new ArrayList<Animal>();
Collection<?> c7 = new ArrayList<Dog>();
Collection<?> c8 = new ArrayList<Cat>(); //? extends E:向下限定,E及其子类
// Collection<? extends Animal> c9 = new ArrayList<Object>(); 报错,Object不是Animal子类
Collection<? extends Animal> c10 = new ArrayList<Animal>();
Collection<? extends Animal> c11 = new ArrayList<Dog>();
Collection<? extends Animal> c12 = new ArrayList<Cat>(); //? super E:向上限定,E及其父类
Collection<? super Animal> c13 = new ArrayList<Object>();
Collection<? super Animal> c14 = new ArrayList<Animal>();
// Collection<? super Animal> c15 = new ArrayList<Dog>(); 报错,Dog不是Animal及其以上的类型
// Collection<? super Animal> c16 = new ArrayList<Cat>(); 同上
}
}
Java泛型的应用的更多相关文章
- Java泛型的历史
为什么Java泛型会有当前的缺陷? 之前的章节里已经说明了Java泛型擦除会导致的问题,C++和C#的泛型都是在运行时存在的,难道Java天然不支持“真正的泛型”吗? 事实上,在Java1.5在200 ...
- 浅析Java 泛型
泛型是JavaSE5引入的一个新概念,但是这个概念在编程语言中却是很普遍的一个概念.下面,根据以下内容,我们总结下在Java中使用泛型. 泛型使用的意义 什么是泛型 泛型类 泛型方法 泛型接口 泛型擦 ...
- Java:泛型基础
泛型 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚很多! 解决这种限制的 ...
- java泛型基础
泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 这种参数类型可以用在类.接口和方法的创建中, 分别称为泛型类.泛型接口.泛型方法. Ja ...
- 使用java泛型设计通用方法
泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 因此我们可以利用泛型和反射来设计一些通用方法. 现在有2张表, 一张user表和一张stu ...
- 关于Java泛型的使用
在目前我遇到的java项目中,泛型应用的最多的就属集合了.当要从数据库取出多个对象或者说是多条记录时,往往都要使用集合,那么为什么这么使用,或者使用时有什么要注意的地方,请关注以下内容. 感谢Wind ...
- 初识java泛型
1 协变数组类型(covariant array type) 数组的协变性: if A IS-A B then A[] IS-A B[] 也就是说,java中的数组兼容,一个类型的数组兼容他的子类类型 ...
- 【Java心得总结四】Java泛型下——万恶的擦除
一.万恶的擦除 我在自己总结的[Java心得总结三]Java泛型上——初识泛型这篇博文中提到了Java中对泛型擦除的问题,考虑下面代码: import java.util.*; public clas ...
- 【Java心得总结三】Java泛型上——初识泛型
一.函数参数与泛型比较 泛型(generics),从字面的意思理解就是泛化的类型,即参数化类型.泛型的作用是什么,这里与函数参数做一个比较: 无参数的函数: public int[] newIntAr ...
- 初识Java泛型以及桥接方法
泛型的由来 在编写程序时,可能会有这样的需求:容器类,比如java中常见的list等.为了使容器可以保存多种类型的数据,需要编写多种容器类,每一个容器类中规定好了可以操作的数据类型.此时可能会有Int ...
随机推荐
- cocurrent包 锁 Lock
20. 锁 Lock java.util.concurrent.locks.Lock 是一个类似于 synchronized 块的线程同步机制.但是 Lock 比 synchronized 块更加灵活 ...
- JAVA常见算法题(二十一)
package com.xiaowu.demo; //求1+2!+3!+...+20!的和. public class Demo21 { public static void main(String[ ...
- HTML5 资源导航
1,百度百科 http://baike.baidu.com/view/951383.htm 2,w3school http://www.w3school.com.cn/html5/ 3, HTML5 ...
- c++之map函数/迭代器
参考文献:https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html #include <iostream> #include < ...
- Java的身份证号码工具类
/** * Copyright (C) 2009-2010 Yichuan, Fuchun All rights reserved. * Licensed to the Apache Software ...
- 计算机速度GHz等于每秒多少次
这个是没有对比关系的.需要看处理器的微指令.计算机的GHz指的是CPU的时钟频率,不同的指令需要的时钟个数是不同的,列如,从内存读一个数据,一般需要4个时钟周期,而进行一次8位数的加法运算,一般需要1 ...
- iOS小技巧 - 为按钮设置不同状态下的背景色
我们知道直接在Storyboard中设置按钮的背景色是不能根据不同状态来更改的,那问题来了,如果我们需要在不同的状态下(比如按钮没有被按下或者被按下),使得按钮呈现不同的背景色怎么办? 比如上图左边是 ...
- EffectiveJava(16)复合优先于继承
为什么复合优先于继承? 1.继承违反了封装原则,打破了封装性 2.继承会不必要的暴露API细节,称为隐患.比如通过直接访问底层使p.getProperty(K,V)的键值对可以不是String类型 3 ...
- Java Applet 基础
Java Applet 基础 Applet 是一种 Java 程序.它一般运行在支持 Java 的 Web 浏览器内.因为它有完整的 Java API支持,所以Applet 是一个全功能的 Java ...
- react-native 极光推送(jpush-react-native)
极光推送官方支持的 React Native 插件 安装 npm install jpush-react-native --savenpm install jcore-react-native --s ...