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

【Java范型二】Java范型详解之extend限定范型参数的类型

 
阅读更多

在第一篇中,定义范型类时,使用如下的方式:

 

public class Generics<M, S, N> {
   //M,S,N是范型参数
}

 这种方式定义的范型类有两个基本的问题:

 

1. 范型参数定义的实例字段,如private M m = null;由于M的类型在运行时才能确定,那么我们在类的方法中,无法使用m,这跟定义private Object m = null没有什么分别

 

2. 在上面的类型定义中,M,S,N太随意,如果是自己定义范型类自己使用,那么可以保证为M,S,N传入这个范型类型需要的实际类型,但是当这个范型类作为框架的一部分或者API给其它人用,那么我们需要限定M,S,N的类型,以便于在范型类中做具体的事情

 

 基于此,Java提供了在定义范型类时限定类型参数的类型的方式

 

 举例:

package com.tom.lang.generics;

import java.util.List;

//例子不恰当,只是说明extends在范型中的含义
public class List2ToStringUtil<T extends List> {//T实现了List接口或者继承自List接口
    private T list;  //list是List类型的,可以作为list使用

    public List2ToStringUtil(T list) {
        this.list = list;
    }

    public String getString() {
        StringBuilder sb = new StringBuilder();
        System.out.println(list.getClass().getName());
        for (int i = 0; i < list.size(); i++) {
            sb.append(list.get(i).toString()).append(",");
        }
        return sb.toString();
    }
}

    //使用
    @Test
    public void testExtend() {
        List<String> list = new ArrayList<String>();
        list.add("A");
        list.add("B");
        List2ToStringUtil<List> collection = new List2ToStringUtil<List>(list);
        String str = collection.getString();
        System.out.println(str);

        Set<String> set = new HashSet<String>();
        set.add("A");
        set.add("B");
        List2ToStringUtil<List> collection = new List2ToStringUtil<Set>(set); //Set作为范型参数不正确
        List2ToStringUtil<List> collection = new List2ToStringUtil<List>(set); //set集合作为构造参数不正确,类型不匹配
    }

 

上面的例子不怎么恰当,只是演示了extend的用法,List2StringUtil是范型类,它能接受的范型必须是继承自java.util.List的集合;然后在类中,可以像使用List list一样使用T list。

 

总结

1. 使用 <T extends SuperClass>之后,类型参数就必须是继承自SuperClass

2. 在类的定义中,T不再是要等到运行时才能确定的类型,它在编译时就可以确定它是SuperClass或者SuperClass的子类型,不论哪种情况,都可以当做SuperClass来用,可以调用SuperClass提供的方法

 

类型参数的默认限制

不使用extends关键字声明范型类,实际上是extends Object,比如

 

public class Generics<M, S, N> {
   //M,S,N是范型参数
}

实际上是

public class Generics<M extends Object, S extends Object, N extends Object> {
   //M,S,N是范型参数
}

 

 

 

 

 

 

 

 

 

 

 

 

 

0
0
分享到:
评论

相关推荐

    Java 范型Java 范型.doc

    Java 范型Java 范型

    Java 范型攻略篇

    #### 二、理解Java范型:参数化类型 Java范型的核心概念是参数化类型(Parameterized Types),即允许在类、接口或方法中声明类型参数,从而在使用这些结构时可以指定具体的类型。例如,`ArrayList`在Java 1.5中被...

    JAVA范型指南中文版

    Java 泛型是一种在编程中实现强类型检查和减少冗余...总之,Java泛型通过引入类型参数和类型安全机制,极大地提高了代码的质量和可维护性,降低了类型转换的风险。理解和熟练掌握泛型是每个Java开发者必备的技能之一。

    java 泛型类的类型识别示例

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

    java 带两个类型参数的泛型

    泛型还可以在方法中使用,以限制传入或返回的参数类型。例如,一个函数可能接受两个相同类型的参数并返回它们的和: ```java public &lt;T extends Number&gt; T sum(T num1, T num2) { return num1.add(num2); } ``` ...

    java范型[参考].pdf

    泛型允许我们在编写类、接口和方法时指定一种或多种类型参数,使得代码能够处理多种不同类型的对象,同时在编译时进行严格的类型检查,避免了运行时的类型转换异常。 在泛型引入之前,Java集合框架中的类如`List`,...

    java范型[参照].pdf

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

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

    在方法内部,`T`可以作为参数类型使用,但必须确保在方法中不创建`T`的实例,除非有具体的类型参数。 至于枚举(Enums),它是Java中一种特殊的类类型,用于定义固定的常量集合。枚举常用于表示有限的、预定义的...

    Java如何获取泛型类型

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

    java范型学习

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

    java范型视频

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

    分布式系统原理与范型答案(第二版)答案

    《分布式系统原理与范型(第二版)》这本书深入浅出地介绍了这一主题,旨在帮助读者理解分布式系统的概念、设计模式以及实际应用。现在我们来详细探讨一下该书可能涵盖的关键知识点。 1. **分布式系统定义**:...

    一个很好的范型立例题

    - 擦除后,泛型类的实例将退化为无参数类型,但编译器会检查类型安全。 4. 泛型与多态 - 泛型与多态结合使用,可以创建强类型的容器,保证添加到容器中的元素类型一致。 - 泛型与多态的区别在于,多态是在运行时...

    C++多范型设计

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

    分布式系统原理与范型(第二版)

    在《分布式系统原理与范型》第二版中,读者可以期待深入探讨这些范型的实现细节,以及如何在实际项目中应用。书中可能涵盖了诸如CAP定理、Paxos协议、Raft共识算法、Chubby锁服务、Zookeeper协调服务等经典理论和...

    范型程序设计与 STL.pdf

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

    分布式系统原理与范型第二版课后习题答案

    透明性是分布式系统的关键特性之一,它指的是系统的某些属性对用户或客户端程序来说是不可见的,使得用户在使用系统时感觉不到系统的分布式特性。分布式系统的透明性具体可以分为几种类型:访问透明、位置透明、移植...

    分布式系统原理与范型第二版(中+英)

    分布式系统原理与范型 第二版 英文+中文版本 全书分为两部分:原理和范型。第一部分详细讨论了分布式系统的原理、概念和技术,其中包括通信、进程、命名、同步、一致性和复制、容错以及安全。第二部分给出了一些...

    《分布式系统原理与范型(第二版)》复习资料

    分布式系统原理与范型是计算机科学领域的一个重要研究方向,它涉及如何构建和管理由多个独立计算机组成的系统,这些系统能够协调工作,对外表现得就像单一的、协调一致的系统一样。在分布式系统中,透明性、开放性、...

Global site tag (gtag.js) - Google Analytics