【Java学习笔记】Java6泛型实例

简介:

你若是不使用泛型,则会这样处理数据类型不确定的问题:

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()); 
    } 
}




本文转自gnuhpc博客园博客,原文链接:http://www.cnblogs.com/gnuhpc/archive/2012/12/17/2822245.html,如需转载请自行联系原作者

相关文章
|
8天前
|
JavaScript Java 编译器
Java包装类和泛型的知识点详解
Java包装类和泛型的知识点的深度理解
|
29天前
|
Java
java中的泛型类型擦除
java中的泛型类型擦除
13 2
|
1月前
|
Java 程序员
Java 异常处理与正则表达式详解,实例演练及最佳实践
在 Java 代码执行期间,可能会发生各种错误,包括程序员编码错误、用户输入错误以及其他不可预料的状况。 当错误发生时,Java 通常会停止并生成错误消息,这个过程称为抛出异常。 try...catch 语句 try 语句允许您定义一段代码块,并在其中测试是否发生错误。 catch 语句允许您定义一段代码块,当 try 块中发生错误时执行该代码块。 try 和 catch 关键字成对使用,语法如下:
42 0
|
1月前
|
存储 Java
Java 编程实例:相加数字、计算单词数、字符串反转、元素求和、矩形面积及奇偶判断
Java中相加两个数字可通过简单赋值实现,如`int sum = x + y;`。若要用户输入数字相加,可使用`Scanner`类读取。计算单词数,可使用`split()`方法或`StringTokenizer`类。反转字符串,可用`for`循环或`StringBuilder`的`reverse()`方法。计算数组元素总和,可遍历数组累加。矩形面积通过长度乘以宽度得出。判断奇偶性,利用模2运算或位运算检查最低位。更多内容,可关注微信公众号`Let us Coding`。
49 0
|
28天前
|
Java
java面向对象高级分层实例_实体类
java面向对象高级分层实例_实体类
10 1
|
1月前
|
存储 Java fastjson
Java泛型-4(类型擦除后如何获取泛型参数)
Java泛型-4(类型擦除后如何获取泛型参数)
33 1
|
7天前
|
Java Shell
Java 21颠覆传统:未命名类与实例Main方法的编码变革
Java 21颠覆传统:未命名类与实例Main方法的编码变革
10 0
|
7天前
|
存储 监控 安全
泛型魔法:解码Java中的类型参数
泛型魔法:解码Java中的类型参数
30 0
泛型魔法:解码Java中的类型参数
|
9天前
|
Java API
Java基础—笔记—内部类、枚举、泛型篇
本文介绍了Java编程中的内部类、枚举和泛型概念。匿名内部类用于简化类的创建,常作为方法参数,其原理是生成一个隐含的子类。枚举用于表示有限的固定数量的值,常用于系统配置或switch语句中。泛型则用来在编译时增强类型安全性,接收特定数据类型,包括泛型类、泛型接口和泛型方法。
9 0
|
28天前
|
Java
java面向对象高级分层实例_测试类(main方法所在的类)
java面向对象高级分层实例_测试类(main方法所在的类)
9 1