当前位置:首页 > 开发 > 编程语言 > Java > 正文

【Java范型三】Java范型详解之范型类型通配符

发表于: 2014-09-01   作者:bit1129   来源:转载   浏览:
摘要:     定义如下一个简单的范型类,   package com.tom.lang.generics; public class Generics<T> { private T value; public Generics(T value) { this.value = value; } }

 

 

定义如下一个简单的范型类,

 

package com.tom.lang.generics;

public class Generics<T> {
    private T value;
    public Generics(T  value) {
        this.value = value;
    }
}

 

  

    @Test
    public void test() {
        Generics<Integer> v1 = new Generics<Integer>(10);
        Generics<Long> v2 = new Generics<Long>(10L);
        Generics<Object> v3 = new Generics<Object>(new Object());

         v1  = v2; //编译错
         v2 = v1; //编译错
         v3 = v1; //编译错
    }

 

在Java范型一中给已经说到了,上面的三种类型是不兼容的,即v1,v2,v3赋值语句都有编译错。这个例子代码表明,确定范型类的类型,一方面包括范型类本身,另一方面包括类型参数。范型类型只有类型和类型参数相同,才能认为类型是兼容的。

 

范型通配符

 范型类的类型参数不同导致的类型的变量不能有存放到范型集合中,使用<?>可以通配类型参数,

 

 

        Generics<?>[] array = new Generics[3];
        Generics<Integer> v1 = new Generics<Integer>(10);
        Generics<Long> v2 = new Generics<Long>(10L);
        Generics<Object> v3 = new Generics<Object>(new Object());
        array[0] = v1;
        array[1] = v2;
        array[2] = v3;

 

限制类型的范型通配符

  使用<? extends  SuperClass>定义限制类型的范型通配符,例如

        Generics<? extends Number>[] array = new Generics[3];
        Generics<Integer> v1 = new Generics<Integer>(10);
        Generics<Long> v2 = new Generics<Long>(10L);
        Generics<Object> v3 = new Generics<Object>(new Object());
        array[0] = v1;
        array[1] = v2;
        array[2] = v3; //编译错

 

 

 使用下面的限制类型的范型通配符,会有编译错,这是为什么?也就是说,通配符不能出现在范型类的范型参数列表中?

 

public class Generics<? extends Number> {

}

 

 使用<? super ChildType>

 

        Generics2<? super java.sql.Date>[] array = new Generics2[3];
        Generics2<java.util.Date> v3 = new Generics2<java.util.Date>(new java.util.Date());
        array[0] = v3;

 

上例中,数组中的每个元素的类型参数的类型都是java.sql.Date的父类

 

 

泛型通配符的应用场景

 带有泛型通配符的泛型类,由于通配符只有在运行时才能确定其真正的类型,因此,泛型通配符在上使用上有一定的限制,

 

 1. 如下的定义会有编译错,原因是?是任意类型,在类中无法使用

 

public class Generics<? extends Number> {

}

 

 只能像如下的定义,T这个类型参数在编译时虽然没有确定,但是编译时可以知道这个类型是继承自Number的,因此Number可用的方法,对于T来说也可以使用

public class Generics<T extends Number> {

}

 

 2. 泛型通配符可以用于一致的赋值,例如

 

        Generics<? extends Number>[] array = new Generics[3];
        Generics<Integer> v1 = new Generics<Integer>(10);
        Generics<Long> v2 = new Generics<Long>(10L);
        Generics<Object> v3 = new Generics<Object>(new Object());
        array[0] = v1;

 

 3.又如下面的定义,这个变量定义,可以将泛型类型赋值给var,达到一种Javascript弱类型的效果

 

public class Generics <T> {
    public static void main(String[] args) {
        Generics<?> var = null;
        var = new Generics<String>();
        var = new Generics<Date>();
    }
}
 

 

 

 

 

 

【Java范型三】Java范型详解之范型类型通配符

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
原文地址:http://blog.csdn.net/m13666368773/article/details/7951223 Java的泛型在代码中引用时
用C语言来实现堆栈的范型,体验C语言的真正魅力。相比C++里的范型,用C语言实现感觉更真切,更踏实
偶然间,发现IronPython 1.0支持.Net的范型类,可以讲太强大了。哈! 用以下代码可以测试出来: fro
本文例子下载 http://files.cnblogs.com/foundation/GenericActivitySample.rar 范型Activity Activ
说明:在List<T>范型集合中提供了一类委托,以确定要寻找集合中的哪些符合条件的单个元素或者
任何一个想在程序开发这条路上走远点的人都应当多了解几门语言,多接触一些编程泛型,才能打开眼界
  现在我们所做的很大一部分工作其实就是CRUD, 我们的aspx.cs页面充斥着大量的CRUD逻辑.当需要
说明:在List<T>范型集合中提供了一类委托,以确定要寻找集合中的哪些符合条件的单个元素或者
七周七语言:理解多种编程范型 编辑推荐   2011年Jolt大奖图书   带你轻松入门七种先锋语言  
  我认为,图书的封面很重要,因为首先映入读者眼帘的就是封面,他可以诱发潜在的读者去注意图书,
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号