`
sunnymoon
  • 浏览: 89295 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java泛型的使用

阅读更多
package com.mycompany.mavenproject1;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author sunnymoon
 * 2010-10-16 16:07:40
 * 
 * 泛型使用:包括�上界和下界通配符;无界通配符;泛型类;泛型方法;泛型类的具体化�
 */
public class TestGeneral {

    public static void main(String[] args) {
        TestGeneral.test1();
        System.out.println("test1");
        TestGeneral.test2();
        System.out.println("test2");
        TestGeneral.test3();
        System.out.println("test3");
        TestGeneral.test4();
        System.out.println("test4");
        TestGeneral.test5();
        System.out.println("test5");
        TestGeneral.test6();
        System.out.println("test6");
    }

    /**
     * 集合风格(Collection-like)的泛型函数
     */
    public static void test1() {
        Pair<Integer, Boolean> pair1 = new Pair<Integer, Boolean>(123, true);
        System.out.println(pair1.first + "|" + pair1.second);
        Pair<Integer, Long> pair2 = new Pair<Integer, Long>(123, 123l);
        System.out.println(pair2.first + "|" + pair2.second);
    }

    /**
     * 集合之外风格的泛型函数
     */
    public static void test2() {
        DBFactory facotry = new PairDBFactory();
        System.out.println(facotry.createPair().first + "|" + facotry.createPair().second);
    }

    /**
     * 上界和下界通配符
     * A
     * ?
     * ?
     * A
     */
    public static void test3() {
        /**
         * 用面向对象继承的去思考上界只可读,下界只可写更容易
         * 不可指的是不安全,会在编译,运行时报异常
         */
        final ArrayList<Integer> list = new ArrayList<Integer>(1);
        list.add(100);
        final List<? extends Number> readList = list;
//        readList.add(new Integer(2));//不保证可写
        Number n = readList.get(0);
        System.out.println(n);
        List<? super Number> writeList = new ArrayList<Object>();
        writeList.add(new Integer(5));
//        System.out.println(writeList.get(0));//不保证可读
    }

    /**
     * 通配符
     * 无界通配符
     */
    public static void test4() {
        List<?> list = new ArrayList<Integer>();
        list = new ArrayList<Object>();
    }

    /**
     * 关于泛型方法
     */
    public static void test5() {
        PairMethod<Integer> pairMethod = new PairMethod<Integer>();
        pairMethod.pair(new ArrayList<Long>(1));
        pairMethod.pair2(3);
        pairMethod.pair2_1(4);
        pairMethod.pair3(4);
        PairMethod.pair4(123123l);
        PairMethod.pair4_1(pairMethod);
    }

    /**
     * 关于泛型具体化
     * 您可能想要构造一个数组T[], new T[]是不允许的
     * 解决方案使用的是“类型令牌”
     */
    public static void test6() {
        ArrayExample<Double> example = new ArrayExample<Double>(Double.class);
        Double[] doubles = example.getArray(10);
        System.out.println(doubles.length);
    }
}

/**
 * 以下是测试时创建的类
 */
final class Pair<A, B> {

    public final A first;
    public final B second;

    public Pair(A first, B second) {
        this.first = first;
        this.second = second;
    }
}

abstract class DBFactory<T extends Pair> {

    protected abstract T createPair();

    public List<T> get(String constraint) {
        List<T> pairs = new ArrayList<T>();
        return pairs;
    }
}

final class PairDBFactory extends DBFactory {

    @Override
    protected Pair createPair() {
        return new Pair<Integer, Boolean>(123, false);
    }
}

final class PairMethod<R> {

    /**
     * 开始的<T>为所埯的类型型
     * @param <T>
     * @param list
     * @return
     */
    public <T> List<T> pair(List<T> list) {
        return list;
    }

    /**
     * 同上
     * @param <T>
     * @param obj
     * @return
     */
    public <T> List<T> pair2(T obj) {
        return null;
    }

    public <T> T pair2_1(T obj) {
        return obj;
    }

    /**
     * 打酱油的,实际是泛型类
     * @param obj
     * @return
     */
    public List<R> pair3(R obj) {
        return null;
    }

    /**
     * 静态方法也可
     * @param <T>
     * @param obj
     * @return
     */
    public static <T> List<T> pair4(T obj) {
        return null;
    }

    public static <T> T pair4_1(T obj) {
        return obj;
    }
}

final class ArrayExample<T> {

    private Class<T> clazz;

    public ArrayExample(Class<T> clazz) {
        this.clazz = clazz;
    }

    public T[] getArray(int size) {
        return (T[]) Array.newInstance(clazz, size);
    }
}

分享到:
评论

相关推荐

    Java泛型使用详细分析.pdf

    Java 泛型使用详细分析 Java 泛型是 Java 语言中的一种类型系统特性,允许开发者在编译期检查类型安全,以避免在运行时出现类型相关的错误。在本文中,我们将详细介绍 Java 泛型的使用方法和实现原理。 一、泛型的...

    Java泛型应用实例

    Java泛型是Java编程语言中的一个强大特性,它允许我们在定义类、接口和方法时指定类型参数,从而实现代码的重用和类型安全。在Java泛型应用实例中,我们可以看到泛型如何帮助我们提高代码的灵活性和效率,减少运行时...

    java 泛型方法使用示例

    下面我们将深入探讨Java泛型方法的概念、语法以及使用示例。 **一、泛型方法概念** 泛型方法是一种具有类型参数的方法,这些类型参数可以在方法声明时指定,并在方法体内部使用。与类的泛型类似,它们提供了编译时...

    Java泛型的用法及T.class的获取过程解析

    Java泛型的用法及T.class的获取过程解析 Java泛型是Java编程语言中的一种重要特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。本文将详细介绍Java泛型的用法 及T.class的获取过程解析...

    Java泛型使用详细分析.docx

    这样可以限制泛型使用的类型范围。 7. **类型擦除** 需要注意的是,Java的泛型是类型擦除的,这意味着在运行时,所有的泛型信息都会被擦除,实际的类型检查都在编译期间完成。因此,泛型不会影响程序的运行时性能...

    JAVA泛型加减乘除

    这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...

    很好的Java泛型的总结

    Java泛型机制详解 Java泛型是Java语言中的一种机制,用于在编译期检查类型安全。Java泛型的出现解决了Java早期版本中类型安全检查的缺陷。Java泛型的好处是可以在编译期检查类型安全,避免了运行时的...

    Java泛型三篇文章,让你彻底理解泛型(super ,extend等区别)

    Java 泛型详解 Java 泛型是 Java SE 5.0 中引入的一项特征,它允许程序员在编译时检查类型安全,从而减少了 runtime 错误...通过了解 Java 泛型的基本概念和关键字,我们可以更好地使用泛型来提高代码的质量和可读性。

    java泛型技术之发展

    - **早期版本的局限**:在Java泛型出现之前,程序员通常使用Object作为容器类(如ArrayList、HashMap等)的默认类型,这导致了大量的类型转换操作,同时也容易引发ClassCastException。 - **类型擦除**:Java泛型...

    1.java泛型定义.zip

    1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1....

    java 泛型接口示例

    下面我们将详细探讨Java泛型接口的相关知识点。 1. **泛型接口的定义** 泛型接口的定义方式与普通接口类似,只是在接口名之后添加了尖括号`&lt;T&gt;`,其中`T`是一个类型参数,代表某种未知的数据类型。例如: ```java...

    4.java泛型的限制.zip

    4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip...

    java 泛型类的类型识别示例

    综上所述,虽然Java泛型在编译后会进行类型擦除,但通过上述技巧,我们仍然能够在运行时获得关于泛型类实例化类型的一些信息。在实际开发中,这些方法可以帮助我们编写更加灵活和安全的代码。在示例文件`GenericRTTI...

    java泛型的内部原理及更深应用

    Java泛型是Java编程语言中的一个强大特性,它允许在定义类、接口和方法时使用类型参数,从而实现参数化类型。这使得代码更加安全、可读性更强,并且能够减少类型转换的必要。在“java泛型的内部原理及更深应用”这个...

Global site tag (gtag.js) - Google Analytics