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

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

 
阅读更多

 

 

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

 

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 泛型是一种在编程中实现强类型检查和减少冗余类型转换的机制,它是在JDK 1.5版本中引入的。泛型的主要目标是提高代码的类型安全性、可读性和重用性,避免在运行时出现类型转换异常。 1. **泛型的基本概念** -...

    java1.5范型编程指南

    在Java 1.5中引入的泛型(Generics)是编程语言的重大改进,它允许开发者在定义类、接口和方法时指定参数类型,从而提供了更强的类型检查和类型安全性。泛型的主要目标是消除强制类型转换,防止在运行时出现类型错误...

    一个很好的范型立例题

    Java范型是Java编程语言中的一个重要特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的重用性和安全性。范型在Java中引入的主要目标是增强类型安全,减少强制类型转换,并帮助开发者编写更清晰、更易于...

    jdk1.5中的范型

    ### JDK 1.5 中的范型 #### 引言 自 JDK 1.5 开始,Java 语言正式引入了一项重要的特性——泛型(Generics),这使得 Java 成为了一个更为强大且灵活的语言。泛型允许开发人员编写出类型安全的通用类或方法,从而...

    实验六,集合与范型.zip

    其次,范型(Generics)是Java 5引入的新特性,它的目的是为了增强类型安全性,并消除运行时的类型检查。范型允许我们在创建集合时指定其元素类型,从而避免了类型转换错误和潜在的ClassCastException。 1. 泛型类...

    关于java的泛型.doc

    关于Java的泛型,这是Java 5.0版本引入的一项重大特性,旨在提供类型安全的集合操作,并增强代码的重用性和灵活性。泛型允许程序员在设计类或接口时使用类型参数,使得类或接口可以处理任何数据类型,而不必为每种...

    java泛型

    ### Java泛型详解 #### 一、泛型概念与起源 **定义:** Java泛型是一种在编程语言中实现类型安全容器的技术。泛型的概念仅存在于编译阶段,它的主要目的是帮助开发人员创建灵活且类型安全的代码。通过在类、接口或...

    2022年牛客网-后端开发笔试题目

    在Java中,基本数据类型(如int、double等)都有对应的引用数据类型,这些引用数据类型被称为包装类型。 - **自动装箱与拆箱**:自动将基本类型转换为包装类型(装箱),或将包装类型转换为基本类型(拆箱)。 - **...

    Perl 实例精解(第三版).pdf

    原书名: Perl by Example(Third Edition),原出版社: PH PTR,作者: Ellie Quigley,译者: 杜炜,出版社:清华大学出版社,出版日期:...16.3.6 Globbing(文件名扩展和通配符) 16.4 错误处理 16.4.1 die函数

Global site tag (gtag.js) - Google Analytics