【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,如需转载请自行联系原作者

相关文章
|
3月前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
3月前
|
Java API
[Java]泛型
本文详细介绍了Java泛型的相关概念和使用方法,包括类型判断、继承泛型类或实现泛型接口、泛型通配符、泛型方法、泛型上下边界、静态方法中使用泛型等内容。作者通过多个示例和测试代码,深入浅出地解释了泛型的原理和应用场景,帮助读者更好地理解和掌握Java泛型的使用技巧。文章还探讨了一些常见的疑惑和误区,如泛型擦除和基本数据类型数组的使用限制。最后,作者强调了泛型在实际开发中的重要性和应用价值。
77 0
[Java]泛型
|
2月前
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
62 0
|
3月前
|
存储 安全 Java
🌱Java零基础 - 泛型详解
【10月更文挑战第7天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
25 1
|
3月前
|
Java 语音技术 容器
java数据结构泛型
java数据结构泛型
37 5
|
3月前
|
存储 Java 编译器
Java集合定义其泛型
Java集合定义其泛型
27 1
|
3月前
|
安全 Java 编译器
Java基础-泛型机制
Java基础-泛型机制
36 0
|
3月前
|
Java 数据安全/隐私保护
java学习笔记(基础习题)
java学习笔记(基础习题)
53 0
|
3月前
|
Java 程序员 开发工具
java学习笔记
java学习笔记
51 0
java202303java学习笔记第二十三天-初识内部类2
java202303java学习笔记第二十三天-初识内部类2
61 0