Java泛型程序设计中的一些限制和局限:
1)不能用基本类型实例化类型参数
例如Pair<double>是不可能出现的,原因是类型擦除(见总结第3篇)之后,Pair会含有Object的域,但是Object不能存储double或者int等基本类型的值。
2)运行时类型查询只适用于原始类型
比如instanceof或者强制转换就涉及到,运行时类型检查,那意思就是说,
o instanceof Pair<String> 实际就是相当于 o instanceof Pair,String或者T之类的都被忽略。
Pari<String> pair = (Pair<String>) o; o只要是Pair类型就可以了,String同样被忽略。
因此,
Pair<String> sPair = ...;
Pair<Date> dPair = ...;
sPair.getClass() == dPair.getClass() 为true,它们都返回的是Pair.class。
3)不能抛出也不能捕获泛型类实例
泛型类不能扩展异常类Throwable!
public class MyException<T> extends Exception { /* */ } // error
不能在catch子句中使用类型变量,如下是不允许的:
public <T extends Throwable> void doWork(Class<T> t) {
try{
do something
}catch(T t){ // ERROR
}
}
However, it is ok to use type variables in exception specifications. The following
method is legal:
public static <T extends Throwable> void doWork(T t) throws T // OK
{
try
{
do work
}
catch (Throwable realCause)
{
t.initCause(realCause);
throw t;
}
}
4)参数化类型的数组不合法
简单的说,就是 Pair<String>[] pairs = new Pair<String>[100] 是ERROR的,
这种情况最好的方法是使用ArrayList<Pair<String>>既安全又有效。
5)不能实例化类型变量,就是不能使用new T(...), new T[...],或者T.class这样的表达式
例如,下面这样的代码,
public static <T extends Comparable> T[] test(T[] a){
Object[] m = new Object[2];
...;
return (T[]) m;
}
在执行String[] ss = test("aa", "bb");时就就出现异常,因为它试图讲Object[]赋给String[].
但是,我们可以通过反射来解决这个问题,就是调用Array.newInstance:
public static <T extends Comparable> T[] test(T[] a){
T[] m = (T[]) Array.newInstance(a.getClass().getComponentType(), 2);
...;
}
6)泛型类的静态上下文中类型变量无效(Type Variables Are Not Valid in Static Contexts of Generic Classes)
You cannot reference type variables in static fields or methods. For example, the follow-
ing clever idea won’t work:
public class Singleton<T>
{
public static T getSingleInstance() // ERROR
{
if (singleInstance == null) construct new instance of T
return singleInstance;
}
private static T singleInstance; // ERROR
}
If this could be done, then a program could declare a Singleton<Random> to share a random
number generator and a Singleton<JFileChooser> to share a file chooser dialog. But it can’t
work. After type erasure there is only one Singleton class, and only one singleInstance field.
For that reason, static fields and methods with type variables are simply outlawed.
7)最后,要注意擦除后的冲突
例如:
class Calendar implements Comparable<Calendar> { . . . }
class GregorianCalendar extends Calendar implements Comparable<GregorianCalendar>
{ . . . } // ERROR
分享到:
相关推荐
Java泛型机制详解 Java泛型是Java语言中的一种机制,用于在编译期检查类型安全。Java泛型的出现解决了Java早期版本中类型安全检查的缺陷。Java泛型的好处是可以在编译期检查类型安全,避免了运行时的...
### Java泛型编程指南知识点详解 #### 一、绪论:理解Java泛型的重要性与背景 **1.1 泛型的基本概念** 泛型是一种在编程语言中支持编写类型安全的通用函数或类的能力。在Java中引入泛型的主要目的是为了提供更...
### Java泛型总结 #### 一、Java泛型概述 Java泛型是在JDK5之后引入的一个特性,它提供了一种类型安全的机制,用于指定集合或其他数据结构中的元素类型。通过使用泛型,程序员可以在编译阶段检测类型错误,避免了...
Java泛型是Java SE 5.0引入的一个重要特性,极大地提高了代码的类型安全性和重用性。在本文中,我们将深入探讨Java泛型的进阶概念,包括通配符、边界、类型擦除以及在实际开发中的应用。 1. 通配符 通配符在Java...
思维导图之Java泛型详解
总结,Java泛型技术的发展极大地提升了Java编程的效率和安全性。它通过编译时检查和类型安全保证,帮助开发者编写出更加健壮和易于维护的代码。理解并熟练掌握Java泛型,是每一个Java开发者必备的技能。
下面我们将深入探讨Java泛型方法的概念、语法以及使用示例。 **一、泛型方法概念** 泛型方法是一种具有类型参数的方法,这些类型参数可以在方法声明时指定,并在方法体内部使用。与类的泛型类似,它们提供了编译时...
Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入,极大地增强了代码的类型安全性和重用性。泛型允许我们在编写类、接口和方法时指定参数化类型,使得代码在编译时期就能捕获类型错误,...
以下是对Java泛型的详细解释: 1. **泛型类型**:泛型类型允许我们在定义类、接口或集合时引入类型参数。比如`List<String>`就是一个泛型类型,其中String是类型参数,代表了列表中的元素类型。这样,当我们将字符...
总结来说,Java泛型的类型擦除虽然在运行时消除了类型信息,但通过编译时的类型检查、桥接方法、通配符等补偿机制,仍然实现了强大的类型安全和便利性。开发者应理解这些补偿机制,以便更好地利用Java泛型进行类型...
### Java泛型的使用详细讲解 #### 一、引言 在Java开发中,泛型是一种重要的语言特性,它能够帮助开发者在不增加代码量的情况下处理多种数据类型,同时还能保持代码的清晰度和可读性。本文将详细介绍Java泛型的...
标题与描述均提到了“全面总结Java泛型--实例”,这表明文章旨在深入解析Java泛型的概念,并通过具体示例来展示其应用。Java泛型是Java编程语言的一个强大特性,它允许在编译时检查类型安全,并且所有的强制转换都是...
Java 泛型是 Java 编程语言中一个强大的特性,它允许在类、接口和方法中使用类型参数,从而增加了代码的复用性和安全性。在本文中,我们将深入探讨 Java 泛型的各种方面。 首先,普通泛型允许我们在定义类时引入一...
"Java 泛型总结(一):基本用法与类型擦除" Java 泛型是 Java 语言中的一种强大功能,它可以使代码更加简洁、安全。下面是对 Java 泛型的基本用法和类型擦除机制的介绍。 泛型的基本用法 ------------- 泛型是...
总结来说,Java泛型与容器详细笔记提供了关于如何使用Java中的泛型和容器类的深入理解,涵盖了Java集合框架的核心组件,泛型的类型安全机制,以及一些提高开发效率的第三方库。文档通过实例代码展示了如何在实际项目...
### Java泛型详解 #### 一、Java泛型概述 Java泛型(Generics)是Java SE 5.0引入的一项重要新特性,它允许开发者在定义类、接口或方法时使用类型参数(Type Parameters)。类型参数在使用时可以用具体的类型来...
关于java泛型的总结: 从入门介绍到项目使用的实际经验归纳总结得出! 从jdk5到jdk8!