`
bit1129
  • 浏览: 1069833 次
  • 性别: 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 范型.doc

    Java 范型Java 范型

    Java 范型攻略篇

    自Java 1.5发布以来,范型成为了Java语言的重要特性之一,极大地提升了代码的类型安全性与复用性。在早期版本的Java中,如Java 1.4及以前,集合框架(如`ArrayList`)只能存储`Object`类型的数据,这导致了类型信息...

    JAVA范型指南中文版

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

    java 泛型类的类型识别示例

    在Java编程语言中,泛型(Generics)是一种强大的特性,它允许我们在编写代码时指定容器(如集合)可以存储的数据类型。这提高了代码的安全性和效率,因为编译器可以在编译时检查类型,避免了运行时...

    java范型[参考].pdf

    Java泛型是Java 5版本引入的一个重要特性,极大地增强了代码的类型安全性和效率。泛型允许我们在编写类、接口和方法时指定一种或多种类型参数,使得代码能够处理多种不同类型的对象,同时在编译时进行严格的类型检查...

    java范型[参照].pdf

    Java泛型是Java 5版本引入的一个重要特性,极大地增强了代码的类型安全性和可读性。泛型允许我们在编写代码时指定容器(如List、Set、Map等集合类)能够存储的数据类型,从而避免了不必要的类型转换,并在编译时期就...

    Java如何获取泛型类型

    Java类型Type 之 ParameterizedType,GenericArrayType,TypeVariabl,WildcardType 从实现的接口获取泛型参数 定义一个泛型父类: public interface SuperClass { String process(P p); } 实现类1: public class...

    Java程序设计范型和枚举PPT教案学习.pptx

    Java程序设计范型和枚举是Java编程中的关键概念,它们极大地增强了代码的类型安全性和重用性。本文将深入探讨这两个主题。 首先,我们来看什么是范型(Generics)。范型是Java SE 5.0引入的一个特性,它允许在类、...

    一个很好的范型立例题

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

    java范型视频

    泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是...

    java范型学习

    Java 泛型是一种强大的语言特性,它在J2SE 5.0中引入,极大地提升了代码的类型安全性和效率。泛型允许我们在编写类、接口和方法时指定一种或多种类型参数,使得代码能够处理多种数据类型,同时避免了运行时的类型...

    C++多范型设计

    C++的范型(Template)是其强大的特性之一,它允许开发者创建泛化的类和函数,这些实体能够在编译时根据不同的类型参数实例化。这使得程序员能够编写出不依赖具体数据类型的通用代码,提升了代码的灵活性和可维护性...

    范型程序设计与 STL.pdf

    范型编程的核心思想是参数化类型,即在编写代码时并不绑定到特定的数据类型,而是使用类型参数。这使得代码能够处理多种数据类型,增强了代码的灵活性和通用性。例如,C++中的模板(templates)就是实现范型编程的...

    用Java Socket实现一个简单的基于P2P范型的即时聊天系统。

    在本文中,我们将深入探讨如何使用Java的Socket编程来实现一个简单的基于P2P(Peer-to-Peer)范型的即时聊天系统。P2P网络架构允许每个节点既是客户端也是服务器,这种模式使得数据传输更加分散,提高了系统的可扩展...

    论文研究-消息传递范型与C/S范型双范型的主数据管理机制 .pdf

    本文提出的基于消息传递范型和客户机/服务器(Client/Server,简称C/S)范型双范型的主数据管理机制,能够有效解决MDM面临的问题。 消息传递范型是计算机科学中的一个基本概念,用于描述进程间通信的方式。在这范型...

    范型参考 (1).java

    范型参考 (1).java

    范型参考 (2).java

    范型参考 (2).java

    《分布式系统原理与范型》.pdf

    《分布式系统原理与范型》作为一本系统介绍分布式系统基本原理与实践应用的书籍,涵盖了分布式系统设计与实现的核心理念。分布式系统指的是由多个可以独立运行的计算单元构成的系统,这些计算单元通过通信网络相互...

    Java 实现泛型List

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

Global site tag (gtag.js) - Google Analytics