1. 例如对于 Pair<T extends Comparable> 或者
public static <T extends Object & Comparable<? super T>> T min(List<T> list),可以调用Class,Field, Method的getTypeParameters函数来获取泛型信息,而对于有继承关系的,例如 DateInternel extends Pair<Date>, 可以用Class对象的getGenericSuperclass或者getGenericInterfaces来获取泛型的类型。
2. 一般对泛型我们会讲到一个擦除问题。主要表现在子类显示覆盖父类某个方法后,会造成在子类中会出现两个参数类型不同的方法,一个是泛型类型擦除后的方法,而一个是子类中指定类型的方法,例如
public class DateInternel extends Pair<Date> {
public Date getSecond() {
return super.getSecond();
}
public void setSecond(Date second) {
if(second.compareTo(getFirst())>=0)
super.setSecond(second);
}
}
当编译完成后,DateInternel类会从父类Pair继承到下面两个方法
public Comparable getSecond() {...}
public void setSecond(Comparable second) {...}
对于get函数,返回值是无法作为函数标识的,这样会有函数同名的错误,而对于set函数,会导致当对DateInternel实例对象调用setSecond(Date second)和setSecond(Comparable second)的结果完全不同,针对这种情况,编译器会产生两个桥接方法来处理。
// Method descriptor #14 (Ljava/lang/Comparable;)V
// Stack: 2, Locals: 2
public bridge synthetic void setSecond(java.lang.Comparable arg0);
0 aload_0 [this]
1 aload_1 [arg0]
2 checkcast java.util.Date [31]
5 invokevirtual com.statestreet.sle.chris.corejava.generic.DateInternel.setSecond(java.util.Date) : void [15]
8 return
Line numbers:
[pc: 0, line: 1]
// Method descriptor #30 ()Ljava/lang/Comparable;
// Stack: 1, Locals: 1
public bridge synthetic java.lang.Comparable getSecond();
0 aload_0 [this]
1 invokevirtual com.statestreet.sle.chris.corejava.generic.DateInternel.getSecond() : java.util.Date [81]
4 areturn
Line numbers:
[pc: 0, line: 1]
桥接代码的大概形式如上,保证了在子类实例函数调用的结果一致性。
bridge方法的解释:bridge method may be created by the compiler when extending a parameterized type whose methods have parameterized arguments.
Synthetic关键字的解释:A class member that does not appear in the source code must be marked using a Synthetic attribute." Also, "The Synthetic attribute was introduced in JDK release 1.1 to support nested classes and interfaces
."
3.对于下面两个实例对象,他们的Class对象是同一对象。
Pair<Date> datePair = new Pair<Date>();
Pair<String> stringPair = new Pair<String>();
datePair.getClass()==stringPair.getClass()
4.泛型不能用于catch block中,例如
public <T> T handle(List<T> list) {
try {
...
} catch(T t) {...}
}
编译器会提示错误。
5.不能创建泛型数组,例如 Pair<Date> pairs = new Pair<Date>[10];
6.不能实例化泛型变量和获取泛型的类信息, 例如 new T() 或者 T.class
7.类中声明的泛型类型不能用于静态变量和静态方法,会有编译错误,例如
public class Pair<T> {
public static T t;
public static Pair<T> getInstance() {...}
}
8.泛型的继承规则,Employee和Manager是父类和子类,但是Pair<Employee>和Pair<Manager>没有任何关系。
分享到:
相关推荐
泛型知识点练习及参考答案
Java泛型x详细知识点思维导图.xmind
### 集合与泛型知识点总结 #### 泛型概览 - **引入原因**:在Java 1.5及之后的版本中,引入了泛型这一特性,旨在提高集合类使用的安全性与灵活性。主要解决的问题包括: - **元素存储的安全性问题**:在非泛型...
泛型约束知识点练习及参考答案
【知识点详解】 1. **集合框架**:Java 集合框架是一组接口...以上是对给定作业题目中涉及的Java Collection框架和泛型知识点的详细说明。通过理解和应用这些概念,可以有效地处理各种数据结构和操作,提高编程效率。
本文将深入探讨泛型的应用、原理、协变与逆变以及泛型缓存等核心知识点。 首先,让我们理解泛型的基本概念。泛型允许我们在类、接口和方法中使用类型参数,这样在编译时就能检查类型安全,避免了运行时的类型转换...
下面将详细解释Java泛型的基本概念、使用方式以及相关的知识点。 1. 泛型的基本概念: - 泛型是一种参数化类型,允许在定义类、接口和方法时使用类型参数,从而创建一种可以适用于多种类型的通用代码。 - 泛型的...
### Java泛型指南经典知识点解析 #### 一、引言 Java 1.5 版本引入了一系列重要的语言特性,其中“泛型”是其中一项关键特性。泛型的引入极大地提高了 Java 语言的类型安全性和代码重用性。本文档旨在深入探讨 ...
下面将详细阐述泛型的主要知识点: 1. 泛型的基本概念: 泛型是Java SE 5.0引入的新特性,主要用于集合框架,它可以限制容器中存储的数据类型,确保在编译时就能检测出错误,而不是等到运行时。泛型使用尖括号`<>`...
"Java高级知识点详解系列"聚焦于几个核心领域:Java内存管理、泛型以及反射。这些概念在实际开发中至关重要,理解它们能够帮助开发者写出更高效、更灵活且更易于维护的代码。 1. **Java内存**:Java内存主要涉及堆...
下面我们将深入探讨"泛型类型转换Demo"中的关键知识点。 1. **泛型的基本概念**: 泛型是Java SE 5.0引入的新特性,它允许在类、接口和方法声明中使用类型参数。通过泛型,我们可以创建可以操作多种数据类型的通用...
#### 核心知识点解析:泛型工具类 标题提到的“泛型工具类”主要指的是一种设计模式或编程实践,它提供了一系列用于处理泛型类型的工具方法。这类工具类通常用于辅助其他类或框架(如DAO层)更高效地操作泛型数据。...
下面我们将详细探讨Java泛型接口的相关知识点。 1. **泛型接口的定义** 泛型接口的定义方式与普通接口类似,只是在接口名之后添加了尖括号`<T>`,其中`T`是一个类型参数,代表某种未知的数据类型。例如: ```java...
总结起来,这个案例涵盖了以下知识点: 1. 泛型的概念和C#中的泛型使用。 2. Web服务(ASMX或WCF)的基本原理和泛型对象的序列化与反序列化。 3. 移动端如何与Web服务通信,包括泛型对象的序列化和反序列化。 4. 在...
下面将详细探讨C#泛型集合的使用及其相关知识点。 1. **泛型接口与类** C#中的泛型接口如`IEnumerable<T>`和泛型类如`List<T>`、`Dictionary, TValue>`是泛型集合的基础。这些接口和类定义了操作数据的一般方法,...