一.开篇
泛型是我到目前为止觉得很难啃的硬骨头之一。我一直认为学习这些东西,所花费的时间和要达到的效果短期内是不成正比的,但从长远来看,要写出好的代码,这些基础必须掌握。这也是为什么我准备花一个月的时间,再次学习Java基础的原因。
二.泛型术语
- 泛型(Generic):适应于许多许多的类型。泛型类和泛型接口统称为泛型。比喻List<E>。
- 泛型类:一个类可以适应于许多许多的类型。
- 泛型接口:一个接口可以适应于许多许多的类型。和泛型类没什么区别。
- 泛型方法:一个方法可以适应于许多许多的类型。比喻static <E> List<E> asList(E[] a)
- 原生态类型(raw type):不带任何实际类型参数的泛型名称。每一个泛型都有一个原生态类型,与List<E>相对应的原生态类型是List。
- 形式类型参数:既然一个类(或接口或方法)可以适应于许多许多的类型,那总该有一个东西来标识这个类型吧,就是形式类型参数。K键 V值 E异常 T类型 这些都是形式类型参数。
- 实际类型参数:形式类型参数的值,比喻String。
- 参数化的类型:比喻List<String>。
- 其它术语将在后文介绍。
三.泛型类和泛型方法
- 是否拥有泛型方法,与其所在的类是否是泛型没有关系。
- 泛型类里没有定义泛型方法想要的形式类型参数,泛型方法需要自己定义。
- 泛型类里定义了形式类型参数,泛型方法可以使用这些形式类型参数。
- 无论何时,只要你能做到,就应该使用泛型方法代替泛型类,缩写泛型的范围,使这个类的表达更加清楚。
- 泛型类里定义了形式类型参数,static方法不能使用这些形式类型参数,需要自己定义。
- 使用泛型类时,必须在创建对象的时候指定形式类型参数的值(即实际类型参数);而使用泛型方法的时候,通常不必指明形式类型参数的值,因为编译器会为我们找出具体的类型,这被称为“类型参数推断”。
- 类型推断只对赋值操作有效,对传递无效。编译器认为,调用泛型方法后的返回结果具体类型将由Object取代。可以通过显式的类型说明解决。
- 显式的类型说明:
- 类.<实际类型参数...>method()
- 对象.<实际类型参数...>method()
- this.<实际类型参数...>method()
四.说明例子
- 说明2356的例子
package com.jyz.study.jdk.generic; /** * Java泛型里,static方法是无法访问泛型类的形式类型参数(T)的. * 需要自己定义 * @author JoyoungZhang@gmail.com * */ public class StaticMethodGeneric<T> { // compile error, can not access T // public static T test1(T obj){ // return obj; // } //泛型类里定义了形式类型参数,static方法不能使用这些形式类型参数,需要自己定义 public static <T> T test1(T obj){ return obj; } //泛型类里定义了形式类型参数T,泛型方法可以使用这些形式类型参数 private T test2(T obj){ return obj; } //泛型类里没有定义泛型方法想要的形式类型参数TT,泛型方法需要自己定义 private <TT> TT test3(TT obj){ return obj; } public static void main(String[] args) { //使用泛型方法的时候,通常不必指明形式类型参数的值, //因为编译器会为我们找出具体的类型,这被称为“类型参数推断”。 System.out.println(StaticMethodGeneric.test1("sa")); System.out.println(StaticMethodGeneric.test1(1)); //使用泛型类时,必须在创建对象的时候指定形式类型参数的值; System.out.println(new StaticMethodGeneric<String>().test2("sa")); System.out.println(new StaticMethodGeneric<Integer>().test2(1)); } }
- 说明78的例子
package com.jyz.study.jdk.generic; import java.util.HashMap; import java.util.Map; /** * GnericMethodReturnObject * 显式的类型说明 * @author JoyoungZhang@gmail.com * */ public class ExplicitTypeSpecification { static class NewCollections1{ public static <K, V> Map<K, V> map(){ return new HashMap<K, V>(); } } class NewCollections2{ public <K, V> Map<K, V> map(){ return new HashMap<K, V>(); } } public <K, V> Map<K, V> map(){ return new HashMap<K, V>(); } static void test1(Map<Integer, String> map){ } public void main() { //compile error, NewCollections.map() return Map<Object, Object>, but test1 requried Map<Integer, String> test1(NewCollections1.map()); //compile ok. 等价于Map<Integer, String> map = NewCollections1.<Integer, String>map(); test1(NewCollections1.<Integer, String>map()); //compile error, NewCollections.map() return Map<Object, Object>, but test1 requried Map<Integer, String> test1(new NewCollections2().map()); //compile ok. 等价于Map<Integer, String> map2 = new NewCollections2().<Integer, String>map(); test1(new NewCollections2().<Integer, String>map()); //compile error, this.map() return Map<Object, Object>, but test1 requried Map<Integer, String> test1(this.map()); //compile ok. 等价于Map<Integer, String> map = this.<Integer, String>map(); test1(this.<Integer, String>map()); } }
相关推荐
《Java核心技术卷一:基础知识》是Java学习领域内的一本经典著作,该书第八版英文原版清晰且非扫描版,确保了读者能够获得高质量的阅读体验。本书由CAY S. HORSTMANN和GARY CORNELL共同编写,两位作者在计算机科学...
Java 术语中英对照是 Java 编程语言中的一种重要概念,它可以帮助程序员更好地理解 Java 编程语言的基本概念和技术。下面是 Java 术语中英对照的一些重要知识点: 1. 构建式(Constructor):在 Java 中,构建式是...
在编程世界中,Java是一种广泛使用的面向对象的编程语言,具有强大的功能和广泛的应用场景。"最新版---JAVA专业术语集"旨在帮助开发者深入理解Java编程中的..."JAVA专业术语集"将是你Java学习路上不可或缺的参考资料。
3. Java 是一种非常容易学习的程序设计语言 4. Java 将成为适用于所有平台的通用性编程语言 5. Java 只不过是另外一种程序设计语言 6. 现在有了 C#,Java 过时了 7. Java 有专利,应该避免使用 8. Java 是解析型的,...
【JAVA术语中英文对照】是Java开发者必备的基础知识,它涉及到编程语言的各个方面。下面将对部分关键术语...同时,随着技术的更新和发展,新的术语也会不断出现,保持学习和更新是成为一名优秀Java开发者的必备素质。
2. **适配器模式 (adapter pattern)**:一种设计模式,允许不同接口或类之间进行通信,通过创建一个适配器类来转换不兼容接口。 3. **API (Application Programming Interface)**:一组预定义的函数、类和接口,供...
"Java biji",这个术语可能指的是Java的笔记或者学习记录,而"Java-biji.rar"则是一个包含这些笔记的压缩文件。从描述来看,这是一份学霸的学习笔记,可以期待其中包含了深入且系统的Java学习资料。 首先,我们来...
genericity是Java中的一种泛型机制,用于提供通用的解决方案。 process(行程/进程) process是Java中的一种进程,用于执行特定的任务。 thread(绪程/线程) thread是Java中的一种线程,用于执行特定的任务...
Java程序设计是计算机科学领域的重要组成部分,特别是在软件开发和互联网应用中扮演...对于“englishyufa”这个文件名,可能是英语语法或者Java中的英文术语练习,这对于理解Java相关的英文文档和技术文章也很有帮助。
《Java词汇表速查手册》是一本专门为Java初学者设计的参考书籍,旨在帮助学习者快速掌握Java编程语言中的核心概念、术语和技术。这本手册深入浅出地讲解了Java编程语言的基础知识,是初学者建立扎实编程基础的理想...
这份“Java Glossary”压缩包提供了一个详细的Java词汇表速查手册,旨在帮助开发者迅速找到所需的概念解释,从而提高学习和工作效率。 文档“java_Vacability.doc”可能包含了关于Java能力、性能或内存管理方面的...
2. **API(Application Programming Interface)**:一组预定义的类、接口和其他元素,允许开发者编写程序并与特定系统或库进行交互。 3. **反模式(Antipattern)**:在软件开发中,反模式是被广泛接受但效果不佳...
《学习Java 12编程》是一本针对Java SE 10、11和12的基础概念的逐步指导书籍,由Nick Samoylov撰写。这本书旨在帮助读者理解Java的核心概念,从初学者的角度出发,深入浅出地介绍Java编程语言。 在第1章“开始Java ...
Java专业术语标准化规范表是Java开发领域中一个重要的参考文档,旨在确保开发团队之间的沟通准确无误,提高代码质量和可维护性。这份规范通常涵盖了Java编程语言中的核心概念、类库、API以及最佳实践的术语定义和...
1. **Java术语**:包括类、对象、方法、变量、接口等。类是对象的蓝图,对象是类的实例;方法是代码块,用于执行特定任务;变量用于存储数据;接口定义了一组方法签名,用于实现多继承。 2. **基本类型与引用类型**...
- 继承:一个类可以从另一个类派生,继承其属性和方法。 - 封装:隐藏实现细节,只暴露公共接口。 - 多态:同一种行为可以通过不同方式表现,如方法重写。 - 抽象:不关注具体实现,只关注接口。 - 范型:泛型...
《Thinking in Java》是Bruce Eckel的经典著作,它是一本深度和广度并重的Java编程教程。这本书深受程序员喜爱,无论是初学者还是有经验的开发者,都能从中受益。中文和英文双语版本的提供,使得全球更多的人能无...
【标题】"java csdn java++" 暗示了这个压缩包可能包含了与Java编程语言相关的学习资料或项目,而"java++"通常不是官方的术语,可能是用户用来表示进阶Java学习或者扩展Java技能的意思。CSDN(China Software ...
4. **继承(Inheritance)**:一个类可以继承另一个类的属性和方法,实现代码重用,体现"Is-A"关系。 5. **多态(Polymorphism)**:同一个接口可以有不同的实现方式,使得程序更灵活,增加代码的可扩展性。 6. **接口...
【JAVA术语中英文对照】 ...这只是Java编程术语的一小部分,全面掌握这些概念对于深入理解Java和软件开发至关重要。学习和实践这些术语将有助于提高编程效率和代码质量,同时也为与其他开发者交流提供便利。