在第一篇中,定义范型类时,使用如下的方式:
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是范型参数 }
相关推荐
Java 范型Java 范型
#### 二、理解Java范型:参数化类型 Java范型的核心概念是参数化类型(Parameterized Types),即允许在类、接口或方法中声明类型参数,从而在使用这些结构时可以指定具体的类型。例如,`ArrayList`在Java 1.5中被...
Java 泛型是一种在编程中实现强类型检查和减少冗余...总之,Java泛型通过引入类型参数和类型安全机制,极大地提高了代码的质量和可维护性,降低了类型转换的风险。理解和熟练掌握泛型是每个Java开发者必备的技能之一。
在Java编程语言中,泛型(Generics)是一种强大的特性,它允许我们在编写代码时指定容器(如集合)可以存储的数据类型。这提高了代码的安全性和效率,因为编译器可以在编译时检查类型,避免了运行时...
泛型还可以在方法中使用,以限制传入或返回的参数类型。例如,一个函数可能接受两个相同类型的参数并返回它们的和: ```java public <T extends Number> T sum(T num1, T num2) { return num1.add(num2); } ``` ...
泛型允许我们在编写类、接口和方法时指定一种或多种类型参数,使得代码能够处理多种不同类型的对象,同时在编译时进行严格的类型检查,避免了运行时的类型转换异常。 在泛型引入之前,Java集合框架中的类如`List`,...
Java泛型是Java 5版本引入的一个重要特性,极大地增强了代码的类型安全性和可读性。泛型允许我们在编写代码时指定容器(如List、Set、Map等集合类)能够存储的数据类型,从而避免了不必要的类型转换,并在编译时期就...
在方法内部,`T`可以作为参数类型使用,但必须确保在方法中不创建`T`的实例,除非有具体的类型参数。 至于枚举(Enums),它是Java中一种特殊的类类型,用于定义固定的常量集合。枚举常用于表示有限的、预定义的...
Java类型Type 之 ParameterizedType,GenericArrayType,TypeVariabl,WildcardType 从实现的接口获取泛型参数 定义一个泛型父类: public interface SuperClass { String process(P p); } 实现类1: public class...
Java 泛型是一种强大的语言特性,它在J2SE 5.0中引入,极大地提升了代码的类型安全性和效率。泛型允许我们在编写类、接口和方法时指定一种或多种类型参数,使得代码能够处理多种数据类型,同时避免了运行时的类型...
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一...这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。
《分布式系统原理与范型(第二版)》这本书深入浅出地介绍了这一主题,旨在帮助读者理解分布式系统的概念、设计模式以及实际应用。现在我们来详细探讨一下该书可能涵盖的关键知识点。 1. **分布式系统定义**:...
- 擦除后,泛型类的实例将退化为无参数类型,但编译器会检查类型安全。 4. 泛型与多态 - 泛型与多态结合使用,可以创建强类型的容器,保证添加到容器中的元素类型一致。 - 泛型与多态的区别在于,多态是在运行时...
C++的范型(Template)是其强大的特性之一,它允许开发者创建泛化的类和函数,这些实体能够在编译时根据不同的类型参数实例化。这使得程序员能够编写出不依赖具体数据类型的通用代码,提升了代码的灵活性和可维护性...
在《分布式系统原理与范型》第二版中,读者可以期待深入探讨这些范型的实现细节,以及如何在实际项目中应用。书中可能涵盖了诸如CAP定理、Paxos协议、Raft共识算法、Chubby锁服务、Zookeeper协调服务等经典理论和...
范型编程的核心思想是参数化类型,即在编写代码时并不绑定到特定的数据类型,而是使用类型参数。这使得代码能够处理多种数据类型,增强了代码的灵活性和通用性。例如,C++中的模板(templates)就是实现范型编程的...
透明性是分布式系统的关键特性之一,它指的是系统的某些属性对用户或客户端程序来说是不可见的,使得用户在使用系统时感觉不到系统的分布式特性。分布式系统的透明性具体可以分为几种类型:访问透明、位置透明、移植...
分布式系统原理与范型 第二版 英文+中文版本 全书分为两部分:原理和范型。第一部分详细讨论了分布式系统的原理、概念和技术,其中包括通信、进程、命名、同步、一致性和复制、容错以及安全。第二部分给出了一些...
分布式系统原理与范型是计算机科学领域的一个重要研究方向,它涉及如何构建和管理由多个独立计算机组成的系统,这些系统能够协调工作,对外表现得就像单一的、协调一致的系统一样。在分布式系统中,透明性、开放性、...