一.开篇
在学习泛型的过程中,有许多零零碎碎的知识点,它们并不好用单独一篇文章来说,遂罗列如此。
二.泛型异常
- catch语句不能捕获泛型类型的异常,因为在编译器和运行期间都必须知道异常的确切类型。
- 泛型类不能直接或间接继承Throwable,这并不是说泛型形式类型参数不能继承Throwable。
package com.jyz.study.jdk.generic; /** * 泛型在异常中的限制 * @author JoyoungZhang@gmail.com * */ public class GenericException<T extends Throwable> { void test(T t) throws T{//T被擦除到了Throwable, 可以声明形式类型参数这个异常 try{ throw t; //T被擦除到了Throwable,这里也可以编译通过 }catch(T ex){ //compile error 1.catch块不能捕获泛型类型的异常 //因为在编译器和运行期间都必须知道异常的确切类型,即使知道T被擦除到了Throwable也没用 } } void erasureTest(Throwable t) throws Throwable { try{ throw t; }catch(Throwable ex){ } } } //compile error //2.泛型类不能直接或间接继承Throwable //并不是说泛型形式类型参数不能继承Throwable class MyException<T extends Throwable> extends Throwable{ }
三.泛型数组
- 数组是协变的(covarant), Super[]是Sub[]的父类型。
- 泛型是不可变的invariant, List<Super>跟List<Sub>没有任何关系。
- 以上两点决定了数组和泛型不能很好的混用,如创建 泛型数组,参数化类型的数组,类型参数的数组都是非法的。更多知识点参考代码。
package com.jyz.study.jdk.generic; import java.util.ArrayList; /** * 数组是协变的covarant, Super[]是Sub[]的父类型 * 泛型是不可变的invariant, List<Super>跟List<Sub>没有任何关系 * @author JoyoungZhang@gmail.com * */ public class ArrayAndList<T> { void test1(){ Number[] objectArray = new Long[1]; objectArray[0] = 10.10;//运行时java.lang.ArrayStoreException: java.lang.Double } void test2(T t){ // List<Number> list = new ArrayList<Long>();//comiple error } //数组和泛型不能很好的混用 //如创建 泛型数组,参数化类型的数组,类型参数的数组都是非法的 void illegal(Object object){ //可以按编译器喜欢的方式定义一个泛型数组的引用 List<String>[] justAReference; // //but 永远是一个引用,不能被实例化 // justAReference = new ArrayList<String>()[]; // new ArrayList<T>()[]; // new T[10]; // //以下也不能工作 // obj instanceof T // new T(); } public static void main(String[] args) { System.out.println(new ArrayList<Number>().getClass()); System.out.println(new ArrayList<Integer>().getClass()); } }
- 但我们仍然可以有自己的方式创建泛型数组。三种方式参考Thinking in Java P384-386。第三者方式稍作修改如下。
package com.jyz.component.core.collection; import java.lang.reflect.Array; import java.util.Arrays; /** * 泛型数组 * from Thinking in Java page 385 * @author JoyoungZhang@gmail.com * */ public class JyzArray<T> { private T[] array; /** * * @param clazz 从擦除中恢复类型,使得我们可以创建需要的实际类型的数组 * 该数组的运行时类型就是确切类型T[],而不是擦除后的Object * @param length 数组长度 */ @SuppressWarnings("unchecked") public JyzArray(Class<T> clazz, int length){ array = (T[]) Array.newInstance(clazz, length); } /** * put item to index * @param index * @param item * @throws IndexOutOfBoundsException */ public void put(int index, T item){ RangeCheck(index, array.length); array[index] = item; } /** * * @param index * @return * @throws IndexOutOfBoundsException */ public T get(int index){ RangeCheck(index, array.length); return array[index]; } /** * * @return 泛型数组 */ public T[] rep(){ return array; } private void RangeCheck(int index, int length) { if (index >= length) { throw new IndexOutOfBoundsException("Index: "+index+", Size: "+length); } } public static void main(String[] args) { JyzArray<Integer> jyzArray = new JyzArray<Integer>(Integer.class, 8); for(int i=0; i<8; i++){ jyzArray.put(i, i); } Integer[] array = jyzArray.rep(); System.out.println(Arrays.toString(array)); } }
四.泛型重载
void f(List<T> v){} void f(List<TT> v){}
将产生相同的方法签名,编译不通过。
五.自限定异常
- SelfBounded类接受形式类型参数T,而T有一个边界类限定,这个边界就是拥有T作为形式类型参数的SelfBounded。
- 古怪的循环泛型(CRG)本质:基类用导出类作为其实际类型参数。
public class SelfBounded<T extends SelfBounded<T>> { } //基类用导出类作为其实际类型参数 class GenericType<T>{} class CuriouslyRecurringGeneric extends GenericType<CuriouslyRecurringGeneric>{}
相关推荐
下面将详细解释Java泛型的基本概念、使用方式以及相关的知识点。 1. 泛型的基本概念: - 泛型是一种参数化类型,允许在定义类、接口和方法时使用类型参数,从而创建一种可以适用于多种类型的通用代码。 - 泛型的...
Java泛型x详细知识点思维导图.xmind
通过学习这些知识点,开发者能更好地理解Java泛型的内部原理,以及如何在实际项目中充分利用泛型的特性,提高代码质量和安全性。在这个视频教程中,张孝祥老师将详细讲解这些概念,并通过实例帮助学员深入掌握Java...
Java泛型是Java编程语言中的一个关键...通过深入理解并熟练运用以上知识点,开发者可以写出更加安全、高效且易于维护的Java代码。对于Java泛型的例子,可以通过运行和分析压缩包中的`generic`文件来加深理解和实践。
下面我们将详细探讨Java泛型接口的相关知识点。 1. **泛型接口的定义** 泛型接口的定义方式与普通接口类似,只是在接口名之后添加了尖括号`<T>`,其中`T`是一个类型参数,代表某种未知的数据类型。例如: ```java...
学习Java泛型能够帮助我们更好地编写和使用通用的类、接口和方法。以下是从给定文件的标题、描述、标签和部分内容中提取出的详细知识点。 1. 泛型类和泛型方法: 在Java中,泛型可以应用于类、接口和方法。泛型类和...
### Java泛型指南经典知识点解析 #### 一、引言 Java 1.5 版本引入了一系列重要的语言特性,其中“泛型”是其中一项关键特性。泛型的引入极大地提高了 Java 语言的类型安全性和代码重用性。本文档旨在深入探讨 ...
通过理解和熟练运用这些知识点,开发者可以编写出更加健壮、可读性更强的Java代码,同时减少潜在的类型转换错误,提高代码质量。在实际开发中,尤其是在处理数据结构和算法时,Java泛型扮演着至关重要的角色。
Java泛型是Java编程语言中的一个重要特性,它在2004年随着Java SE ...通过深入理解并熟练运用这些知识点,开发者可以编写出更高效、安全且易于维护的Java代码。`FanXingDemo` 提供的实例有助于加深对这些概念的理解。
在这个"学士后Java集合框架和泛型课后习题答案"中,我们可以深入理解以下几个关键知识点: 1. **集合接口**:List、Set、Map是Java集合框架的三大接口。List接口代表有序且可重复的元素序列,如ArrayList和...
根据给定的信息,我们可以深入探讨Java 1.5中引入的泛型概念及其应用。...以上就是基于给定文件信息对Java 1.5泛型指南的主要知识点的详细介绍。希望这些信息能帮助读者更好地理解和应用Java中的泛型概念。
### Java泛型学习知识点 #### 一、泛型的基本概念及意义 - **引入背景**:JDK 5.0 引入了泛型的概念,这是为了提高 Java 的类型安全性而进行的重要改进。泛型使得程序员能够在编程时指定类型参数,从而避免运行时...
Java泛型是自Java 1.5版本引入的一项...通过以上知识点,我们可以更好地理解和应用Java泛型,提高代码的质量和维护性。泛型不仅提供了类型安全,减少了类型转换的麻烦,同时也使代码更加清晰易懂,降低了出错的可能性。
下面将详细阐述泛型的主要知识点: 1. 泛型的基本概念: 泛型是Java SE 5.0引入的新特性,主要用于集合框架,它可以限制容器中存储的数据类型,确保在编译时就能检测出错误,而不是等到运行时。泛型使用尖括号`<>`...
以下是从标题、描述和部分内容中提炼出的相关知识点: 1. Java泛型(Generics):泛型是Java SE 5.0引入的一个新特性,它允许在编译时提供类型检查,并消除类型转换,从而提高代码的可读性和安全性。泛型使得代码...