`
yinzhangheng
  • 浏览: 11054 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

Java中的泛型使用详细介绍

阅读更多
 
Java基础笔记 – Java中的泛型使用详细介绍
 
1、JDK5.0中的新特性包括:2、泛型:2.1、自定义泛型实现:2.2、自定义泛型数组:2.3、把普通类型转换成泛型:2.4、泛型的泛型:2.5、泛型在HashMap遍历中的使用:Map映射集合实现类HashMap的介绍和迭代遍历方法2.6、使用泛型的好处:2.7、限制使用泛型的类型:2.7.1、定义类时限定类型:
使用extends关键字指定类型:
注意:
2.7.2、在使用时限定类型:2.8、泛型的继承:2.9、泛型接口的实现:
1、JDK5.0中的新特性包括:

① 泛型(Generics)
② 增强的for循环(Enhanced for loop)
③ 自动装箱/自动拆箱(Autoboxing/unboxing)
④ 类型安全的枚举(Type safe enums)
⑤ 静态导入(Static import)
⑥ 可变参数(var args)
下面介绍泛型相关的使用:

2、泛型:

变量类型的参数化。通过引入泛型,将获得编译时类型的安全和运行时更小的跑出ClassCastExceptions异常。

2.1、自定义泛型实现:
//自定义一个泛型
public class MyGenerics<T1,T2> {

    private T1 param1;
    private T2 param2;

    public T1 getParam1() {
        return param1;
    }

    public void setParam1(T1 param1) {
        this.param1 = param1;
    }

    public T2 getParam2() {
        return param2;
    }

    public void setParam2(T2 param2) {
        this.param2 = param2;
    }
}

使用自定义的泛型:

public static void main(String[] args) {
    //使用自定义的泛型
    MyGenerics<Integer, String> myGenerics = new MyGenerics<Integer, String>();
    myGenerics.setParam1(1);
    myGenerics.setParam2("abc");
}
2.2、自定义泛型数组:
public class MyGenerics2<T> {

    private T[] param1;

    public T[] getParam1() {
        return param1;
    }
    public void setParam1(T[] param1) {
        this.param1 = param1;
    }
}

不能使用new关键字创建T类型的对象,而应该传递一个具体的参数类型,如下面的将编译不通过:

MyGenerics<Integer, String> myGenerics = new MyGenerics<T1, T2>();
2.3、把普通类型转换成泛型:
public MyGenerics2(){
    param1 = (T[])new Object[10];
}
2.4、泛型的泛型:
//在泛型中使用泛型
public class MyGenerics3<T1,T2> {

    //前面定义的泛型类MyGenerics
    private MyGenerics<T1,T2> myGenerics;

    public MyGenerics<T1, T2> getMyGenerics() {
        return myGenerics;
    }

    public void setMyGenerics(MyGenerics<T1, T2> myGenerics) {
        this.myGenerics = myGenerics;
    }

    public static void main(String[] args) {
        //使用泛型的泛型
        MyGenerics3<Integer, String> myGenerics3 = new MyGenerics3<Integer, String>();
        myGenerics3.setMyGenerics(new MyGenerics<Integer, String>());
    }
}
2.5、泛型在HashMap遍历中的使用:

详细参考:

Map映射集合实现类HashMap的介绍和迭代遍历方法

Map映射集合实现类HashMap的介绍和迭代遍历方法

遍历HashMap有 种方法,其中使用Entry遍历如下:

//第三种遍历Map的方法
Set<Map.Entry<String, String>> set1 =  map.entrySet();
for(Iterator<Map.Entry<String, String>> iter = set1.iterator(); iter.hasNext();){
    Map.Entry<String, String> entry = iter.next();
    String key = entry.getKey();
    String value = entry.getValue();
    System.out.println(key + ":" + value);
}
2.6、使用泛型的好处:

如果使用了泛型,只要代码在编译时没有出现警告信息,就不会遇到运行时的ClassCastException异常。

2.7、限制使用泛型的类型:

在定义泛型类型时,预设的可以使用任何类型来实例化泛型类型中的类型。如果想要限制泛型类型时,使其只能使用某个特定类型或者其子类型才能实例化该类型时,可以通过:

2.7.1、定义类时限定类型:
使用extends关键字指定类型:

不管是类还是接口,都使用extends:

extends List<String>

public class MyGenerics4<T extends List<String>> {

    private T[] param1;

    public T[] getParam1() {
        return param1;
    }

    public void setParam1(T[] param1) {
        this.param1 = param1;
    }
}
注意:

当没有指定泛型继承的类型或者接口时,默认使用:

T extends Object

所以默认情况下任何类型都可以作为参数传入。

ArrayList<Object> list = new ArrayList<Object>();

等价于:

ArrayList list = new ArrayList();
2.7.2、在使用时限定类型:

类型的通配声明:

可以使用’?’通配字元,并使用extends关键字限定持有者的类型。


声明一个类型时进行限定:

下面使用之前编写的MyGenerics类进行说明:

public static void main(String[] args) {
    //使用’?’通配字元,并使用extends关键字限定持有者的类型
    MyGenerics<? extends Object, ? extends List<String>> myGenerics = null;
    //创建满足类型要求的对象
    myGenerics = new MyGenerics<String, ArrayList<String>>();

    //以下是不符合通配要求的因为HashMap没有实现List
    //myGenerics = new MyGenerics<String, HashMap>();

    //给泛型的泛型赋值
    MyGenerics3<? extends Object, ? extends List<String>> myGenerics3 = null;
    myGenerics3 = new MyGenerics3<Object, List<String>>();

    //可以设置为null
    myGenerics3.setMyGenerics(null);
}
MyGenerics3<?, ?> myGenerics3 = null;

等价于:

MyGenerics3<? extends Object, ? extends Object> myGenerics5 = null;
2.8、泛型的继承:

父类:

public class ParentGenerics<T1, T2> {

    private T1 param1;
    private T2 param2;
    public T1 getParam1() {
        return param1;
    }
    public void setParam1(T1 param1) {
        this.param1 = param1;
    }
    public T2 getParam2() {
        return param2;
    }
    public void setParam2(T2 param2) {
        this.param2 = param2;
    }
}

子类:

public class ChildGenerics<T1, T2, T3> extends ParentGenerics<T1, T2> {

    private T3 param3;

    public T3 getParam3() {
        return param3;
    }

    public void setParam3(T3 param3) {
        this.param3 = param3;
    }
}
2.9、泛型接口的实现:

接口:

public interface GenericsInterface<T1, T2> {

    public void setParam1(T1 t1);

    public void setParam2(T2 t2);
}

实现类:

public class GenericsImpl<T1, T2, T3> implements GenericsInterface<T1, T2> {

    private T1 t1;
    private T2 t2;
    @Override
    public void setParam1(T1 t1) {
        this.t1 = t1;
    }

    @Override
    public void setParam2(T2 t2) {
        this.t2 = t2;
    }
}
 

 

分享到:
评论

相关推荐

    Java泛型使用详细分析.pdf

    Java泛型使用详细分析.pdf

    Java 实现泛型List

    Java 实现泛型List的源码,基本实现了List接口的全部所有方法。欢迎大家发表自己的观点和建议。

    java 泛型方法使用示例

    java 泛型方法使用示例 java 泛型方法使用示例 java 泛型方法使用示例

    Java泛型和集合

    Java Generics and Collections 英文版,详细描述java 泛型技术

    Java中的泛型简析实战.zip

    Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战Java中的泛型简析实战...

    java 泛型的使用 详细讲解

    java 泛型的使用 详细讲解

    2.java定义泛型类.zip

    2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip2.java定义泛型类.zip...

    java 使用泛型.txt

    java 使用泛型,优化重复多余代码.

    Java泛型编程指南.pdf

    Java泛型编程指南.pdf 此文章译自SUN的泛型编程指南

    java 继承泛型类示例

    java 继承泛型类示例 java 继承泛型类示例 java 继承泛型类示例

    java_泛型类相关介绍.docjava_泛型类相关介绍.doc

    这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。  Java语言引入泛型的好处是安全简单。  在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意...

    JAVA泛型加减乘除

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

    java中的泛型-详细

     1、Java泛型  其实Java的泛型就是创建一个用类型作为参数的类。就象我们写类的方法一样,方法是这样的method(String str1,String str2 ),方法中参数str1、str2的值是可变的。而泛型也是一样的,这样写class Java...

    Java1.5泛型指南中文版

    Java1.5泛型指南中文版

    java 泛型类的类型识别示例

    java 泛型类的类型识别示例 java 泛型类的类型识别示例 java 泛型类的类型识别示例

    Java泛型不是真正的泛型

    详细的介绍了Java是伪泛型的原因,介绍了类型擦除的内容等。

    java5泛型新特性 pdf

    java5泛型新特性 pdf,自己看不解释!

    java 一个关于泛型的简单例子

    java 一个关于泛型的简单例子 java 一个关于泛型的简单例子 java 一个关于泛型的简单例子

Global site tag (gtag.js) - Google Analytics