你若是不使用泛型,则会这样处理数据类型不确定的问题:
class Stash {
private Object x;
void set(Object x) {
this.x = x;
}
Object get() {
return(x);
}
}
public class StashOne {
public static void main(String arg[]) {
Stash stash = new Stash();
stash.set("abcd");
String str = (String)stash.get();
}
}
使用了泛型则:
class StashString {
private String x;
void set(String x) {
this.x = x;
}
String get() {
return(x);
}
}
public class StashTwo {
public static void main(String arg[]) {
StashString stash = new StashString();
stash.set("abcd");
String str = stash.get();
}
}
你也可以在创建对象的时候规定类型:
class Stash<T> {
private T x;
void set(T x) {
this.x = x;
}
T get() {
return(x);
}
}
public class StashThree {
public static void main(String arg[]) {
Stash<String> stash = new Stash<String>();
stash.set("abcd");
String str = stash.get();
}
}
或者在赋值的时候规定:
class Stash<T> {
private T x;
void set(T x) {
this.x = x;
}
T get() {
return(x);
}
}
public class StashFour {
public static void main(String arg[]) {
Stash<Object> stash = new Stash<Object>();
stash.set("abcd");
String str = (String)stash.get();
}
}
要想规定某个参数是某各类及其子类的泛型,则:
class Stash<T extends Number> {
private T x;
void set(T x) {
this.x = x;
}
T get() {
return(x);
}
}
public class StashFive {
public static void main(String arg[]) {
Stash<Integer> istash = new Stash<Integer>();
Integer ten = new Integer(10);
istash.set(ten);
ten = istash.get();
Stash<Double> dstash = new Stash<Double>();
Double pi = new Double(3.14159);
dstash.set(pi);
pi = dstash.get();
}
}
对于接口:
import java.util.EventListener;
import javax.swing.JTable;
import javax.swing.undo.UndoManager;
class Stash<T extends EventListener> {
private T x;
void set(T x) {
this.x = x;
}
T get() {
return(x);
}
}
public class StashSix {
public static void main(String arg[]) {
Stash<JTable> tablestash = new Stash<JTable>();
JTable table = new JTable();
tablestash.set(table);
table = tablestash.get();
Stash<UndoManager> dstash = new Stash<UndoManager>();
UndoManager unman = new UndoManager();
dstash.set(unman);
unman = dstash.get();
}
}
而你要是想既规定类又规定实现了某一个接口,那么:
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.Transparency;
class Stash<T extends Image & Transparency> {
private T x;
void set(T x) {
this.x = x;
}
T get() {
return(x);
}
}
public class StashSeven {
public static void main(String arg[]) {
Stash<BufferedImage> bufstash = new Stash<BufferedImage>();
BufferedImage bufimage = new BufferedImage(50,50,0);
bufstash.set(bufimage);
bufimage = bufstash.get();
}
}
而通配符的泛型类可以使你在创建泛型类的指针时可以模糊处理:
class Stash<T> {
private T x;
void set(T x) {
this.x = x;
}
T get() {
return(x);
}
}
public class StashEight {
public static void main(String arg[]) {
Stash<? extends Number> numberstash;
Stash<Integer> integerstash;
integerstash = new Stash<Integer>();
integerstash.set(new Integer(10));
numberstash = integerstash;
Number number = numberstash.get();
System.out.println(number.toString());
Stash<Double> doublestash;
doublestash = new Stash<Double>();
doublestash.set(new Double(3.14159));
numberstash = doublestash;
Double dnumber = (Double)numberstash.get();
System.out.println(dnumber.toString());
}
}
泛型还可以嵌套:
class Pair<T,U> {
private T left;
private U right;
Pair(T l, U r) {
left = l;
right = r;
}
public T getLeft() {
return(left);
}
public U getRight() {
return(right);
}
}
class Stash<T> {
private T t;
void set(T t) {
this.t = t;
}
T get() {
return(t);
}
}
public class Nesting {
@SuppressWarnings("unchecked")
public static void main(String arg[]) {
Stash<Pair<String,Long>> sp;
sp = new Stash<Pair<String,Long>>();
Pair pair = new Pair("Average",new Long(320));
sp.set(pair);
pair = sp.get();
System.out.println(pair.getLeft() + " " + pair.getRight());
}
}
另外泛型不只是类,方法也可以泛型:
import java.awt.Color;
public class GenericMethod {
public static void main(String arg[]) {
GenericMethod gm = new GenericMethod();
gm.objtype("abcd");
gm.gentype("abcd");
gm.objtype(Color.green);
gm.gentype(Color.green);
}
public void objtype(Object t) {
System.out.println(t.getClass().getName());
}
public <T> void gentype(T t) {
System.out.println(t.getClass().getName());
}
}
分享到:
相关推荐
3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3.java实例化泛型类.zip3....
Java泛型学习笔记.pdf
Java Generics and Collections 英文版,详细描述java 泛型技术
Java泛型编程指南.pdf 此文章译自SUN的泛型编程指南
实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门
java,学习java泛型,java培训之泛型.pptxjava培训之泛型.pptxjava培训之泛型.pptxjava培训之泛型.pptx
网上很多讲泛型原理的文章, 很少有提到我们什么时候使用泛型有优势, 我就泛型类和方法搞了两个实例,算是探索下泛型使用的冰山一角吧,在我博客里面有配套的文章,可以配套看.
Java泛型,泛型接口、泛型方法实例
这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...
博客《夯实JAVA基本之一——泛型详解(1)》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/49872903
java泛型实例讲解代码
java泛型详细学习,深入学习java的不二之选
java 泛型接口示例 java 泛型接口示例 java 泛型接口示例
1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1....
JAVA泛型笔记.pdf
基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....
JAVA泛型源代码实现以下功能:返回数组元素的最大值/最小值下标;判断数组元素是否按升序排列;T对象数组排序;二分法查找key元素;
收集的java李兴华老师的课件笔记。感觉还不错,适合回顾和新手补习。
java 泛型类的类型识别示例 java 泛型类的类型识别示例 java 泛型类的类型识别示例