Java编程基础第十章02泛型

合集下载

JAVA泛型详解

JAVA泛型详解

JAVA泛型详解1. 概述在引入范型之前,Java类型分为原始类型、复杂类型,其中复杂类型分为数组和类。

引入范型后,一个复杂类型就可以在细分成更多的类型。

例如原先的类型List,现在在细分成List<Object>, List<String>等更多的类型。

注意,现在List<Object>, List<String>是两种不同的类型,他们之间没有继承关系,即使String继承了Object。

下面的代码是非法的List<String> ls = new ArrayList<String>();List<Object> lo = ls;这样设计的原因在于,根据lo的声明,编译器允许你向lo中添加任意对象(例如Integer),但是此对象是List<String>,破坏了数据类型的完整性。

在引入范型之前,要在类中的方法支持多个数据类型,就需要对方法进行重载,在引入范型后,可以解决此问题(多态),更进一步可以定义多个参数以及返回值之间的关系。

例如public void write(Integer i, Integer[] ia);public void write(Double d, Double[] da);的范型版本为public <T> void write(T t, T[] ta);2. 定义&使用类型参数的命名风格为:推荐你用简练的名字作为形式类型参数的名字(如果可能,单个字符)。

最好避免小写字母,这使它和其他的普通的形式参数很容易被区分开来。

使用T代表类型,无论何时都没有比这更具体的类型来区分它。

这经常见于泛型方法。

如果有多个类型参数,我们可能使用字母表中T的临近的字母,比如S。

如果一个泛型函数在一个泛型类里面出现,最好避免在方法的类型参数和类的类型参数中使用同样的名字来避免混淆。

Java泛型(泛型接口、泛型类、泛型方法)

Java泛型(泛型接口、泛型类、泛型方法)

Java泛型(泛型接⼝、泛型类、泛型⽅法)转载转载出处:泛型接⼝:定义⼀个泛型接⼝:通过类去实现这个泛型接⼝的时候指定泛型T的具体类型。

指定具体类型为Integer:指定具体类型为String:指定具体类型为⼀个⾃定义的对象:泛型类:在编译器,是⽆法知道K和V具体是什么类型,只有在运⾏时才会真正根据类型来构造和分配内存。

泛型⽅法:引⽤其他⼈写的,觉得不错:定义泛型⽅法时,必须在返回值前边加⼀个<T>,来声明这是⼀个泛型⽅法,持有⼀个泛型T,然后才可以⽤泛型T作为⽅法的返回值。

Class<T>的作⽤就是指明泛型的具体类型,⽽Class<T>类型的变量c,可以⽤来创建泛型类的对象。

为什么要⽤变量c来创建对象呢?既然是泛型⽅法,就代表着我们不知道具体的类型是什么,也不知道构造⽅法如何,因此没有办法去new⼀个对象,但可以利⽤变量c的newInstance⽅法去创建对象,也就是利⽤反射创建对象。

泛型⽅法要求的参数是Class<T>类型,⽽Class.forName()⽅法的返回值也是Class<T>,因此可以⽤Class.forName()作为参数。

其中,forName()⽅法中的参数是何种类型,返回的Class<T>就是何种类型。

在本例中,forName()⽅法中传⼊的是User类的完整路径,因此返回的是Class<User>类型的对象,因此调⽤泛型⽅法时,变量c的类型就是Class<User>,因此泛型⽅法中的泛型T就被指明为User,因此变量obj的类型为User。

当然,泛型⽅法不是仅仅可以有⼀个参数Class<T>,可以根据需要添加其他参数。

为什么要使⽤泛型⽅法呢?因为泛型类要在实例化的时候就指明类型,如果想换⼀种类型,不得不重新new⼀次,可能不够灵活;⽽泛型⽅法可以在调⽤的时候指明类型,更加灵活。

java 泛型详解

java 泛型详解

java 泛型详解1. 概述泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。

什么是泛型?为什么要使用泛型?泛型,即“参数化类型”。

一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。

那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。

也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

2.一个栗子一个被举了无数次的例子:List arrayList = new ArrayList();arrayList.add("aaaa");arrayList.add(100);for(int i = 0; i< arrayList.size();i++){String item = (String)arrayList.get(i);Log.d("泛型测试","item = " + item);}毫无疑问,程序的运行结果会以崩溃结束:ng.ClassCastException:ng.Integer cannot be cast to ng.String。

ArrayList可以存放任意类型,例子中添加了一个String类型,添加了一个Integer类型,再使用时都以String的方式使用,因此程序崩溃了。

为了解决类似这样的问题(在编译阶段就可以解决),泛型应运而生。

我们将第一行声明初始化list的代码更改一下,编译器会在编译阶段就能够帮我们发现类似这样的问题。

List<String> arrayList = new ArrayList<String>();...//arrayList.add(100); 在编译阶段,编译器就会报错3.特性泛型只在编译阶段有效。

java泛型方法

java泛型方法

java泛型方法Java泛型方法。

泛型方法是一种可以在调用时指定具体类型的方法,它可以在方法中使用泛型类型,从而增加代码的灵活性和复用性。

在Java中,泛型方法可以在普通类、抽象类和接口中定义,本文将详细介绍Java泛型方法的定义、使用和注意事项。

1. 泛型方法的定义。

在Java中,泛型方法的定义需要在方法返回类型前加上尖括号,并在尖括号中声明泛型类型。

例如:```java。

public <T> T genericMethod(T t) {。

// 方法体。

}。

```。

上面的代码中,`<T>`表示这是一个泛型方法,`T`是泛型类型的占位符,`T genericMethod(T t)`表示这是一个可以接受任意类型参数并返回相同类型的泛型方法。

2. 泛型方法的使用。

泛型方法可以在调用时指定具体类型,也可以根据参数推断类型。

例如:```java。

Integer result = genericMethod(10);String strResult = genericMethod("Hello");```。

上面的代码中,`genericMethod(10)`和`genericMethod("Hello")`分别调用了泛型方法,并指定了具体的类型。

在调用时,编译器会根据参数的类型推断出泛型类型,从而实现类型安全的操作。

3. 泛型方法的注意事项。

在使用泛型方法时,需要注意以下几点:泛型方法可以使用泛型类型和普通类型的参数,也可以同时使用多个泛型类型。

例如:```java。

public <T, E> void printInfo(T t, E e) {。

System.out.println(t.getClass().getName() + ": " + t);System.out.println(e.getClass().getName() + ": " + e);}。

java 泛型的用法

java 泛型的用法

java 泛型的用法摘要:1.泛型的概念2.泛型的优点3.泛型类型参数4.泛型擦除5.泛型使用实例正文:泛型是Java 中一种强大的功能,它允许我们编写可以处理不同类型的代码,从而提高代码的复用性和类型安全性。

泛型的优点在于它可以让我们的代码更加灵活,不需要针对每个类型都编写特定的方法或类。

在Java 中,泛型是通过在类型后面跟上尖括号<>,然后跟一个或多个类型参数来定义的。

这些类型参数通常使用大写字母表示,如T、E、K、V 等。

类型参数可以有一个或多个,用逗号分隔。

当我们使用泛型时,Java 编译器会进行泛型擦除。

这意味着在编译时,泛型类型参数将被替换为实际的类型。

这样一来,运行时的类型信息就与使用泛型之前一样。

这种擦除可以防止在运行时出现类型不匹配的问题。

下面我们通过一个简单的例子来说明泛型的用法。

假设我们有一个Box 类,用于存储和操作不同类型的对象。

我们可以使用泛型来定义这个类,从而使其可以处理多种类型的数据。

```javapublic class Box<T> {private T content;public Box() {}public Box(T content) {this.content = content;}public T getContent() {return content;}public void setContent(T content) {this.content = content;}}```在上面的代码中,我们定义了一个名为Box 的泛型类,泛型类型参数为T。

Box 类包含一个泛型类型的成员变量content,以及相应的构造函数、getter 和setter 方法。

我们可以使用这个泛型Box 类来存储和操作不同类型的数据,例如:```javaBox<String> stringBox = new Box<>();stringBox.setContent("Hello, world!");String stringContent = stringBox.getContent();System.out.println(stringContent);Box<Integer> integerBox = new Box<>();integerBox.setContent(42);int integerContent = integerBox.getContent();System.out.println(integerContent);```通过使用泛型,我们可以在编译时检查类型安全,并在运行时获得正确的类型信息。

泛型知识点总结

泛型知识点总结

泛型知识点总结泛型是Java语言中的一项重要特性,它允许我们在编写代码时使用一种通用的数据类型来代替具体的数据类型,从而提高代码的复用性、可读性和安全性。

本文将重点总结泛型在Java中的基本概念、用法和注意事项,帮助读者深入理解并合理运用泛型。

1.泛型的基本概念泛型是一种在编译时检查和验证数据类型的技术,它可以让我们在编写代码时使用一种通用的数据类型来代替具体的数据类型。

泛型的引入使得编写更加通用且类型安全的代码成为可能,从而提高了代码的可读性和可维护性。

泛型的基本概念主要涉及以下几个方面:1)泛型类(Generic Class):使用泛型定义的类,其成员变量、方法参数和返回值均可以使用泛型类型。

例如:`ArrayList<T>`、`Map<K, V>`等。

2)泛型接口(Generic Interface):使用泛型定义的接口,其方法参数和返回值均可以使用泛型类型。

例如:`Comparable<T>`、`List<E>`等。

3)泛型方法(Generic Method):在普通类或非泛型类中定义的使用泛型的方法。

例如:`public <T> T get(int index)`。

4)泛型通配符(Generic Wildcard):用于表示未知类型的通配符,包括`<? extends T>`、`<? super T>`等。

例如:`List<? extends Number>`。

2.泛型的用法泛型在Java中的用法主要有以下几种:1)定义泛型类泛型类是使用泛型定义的类,其中的成员变量、方法参数和返回值均可以使用泛型类型。

定义泛型类的语法如下:```javapublic class MyClass<T> {private T data;public T getData() {return data;}public void setData(T data) {this.data = data;}}```2)定义泛型接口泛型接口是使用泛型定义的接口,其中的方法参数和返回值均可以使用泛型类型。

java泛型语法

java泛型语法

java泛型语法Java泛型语法是Java编程语言中的一个重要特性,它允许我们编写更加通用和灵活的代码。

通过使用泛型,我们可以在编译时期检测类型错误,并在运行时期避免类型转换异常。

本文将介绍Java泛型的基本语法和使用方法。

一、泛型的定义和作用泛型是Java中的一种参数化类型,它允许我们在定义类、接口和方法时使用类型参数。

通过使用泛型,我们可以将类型作为参数传递给类、接口和方法,从而实现代码的复用和灵活性。

泛型的作用主要有以下几个方面:1. 类型安全:通过使用泛型,我们可以在编译时期检测类型错误,避免类型转换异常。

2. 代码复用:通过定义泛型类、接口和方法,我们可以实现对多种类型的支持,从而提高代码的复用性。

3. 简化代码:通过使用泛型,我们可以减少冗余的类型转换代码,使代码更加简洁。

4. 提高性能:通过使用泛型,我们可以避免使用Object类型,从而减少了装箱和拆箱的开销,提高了代码的执行效率。

二、泛型的基本语法Java中的泛型通过使用尖括号<>来定义类型参数。

在定义类、接口和方法时,我们可以将类型参数放在尖括号中,并在后续的代码中使用该类型参数。

1. 泛型类的定义:```public class GenericClass<T> {private T data;public T getData() {return data;}public void setData(T data) {this.data = data;}}```在上面的代码中,泛型类GenericClass使用了类型参数T。

我们可以在创建GenericClass对象时指定具体的类型,例如:```GenericClass<String> genericString = new GenericClass<>(); genericString.setData("Hello, World!");String data = genericString.getData();```上面的代码中,我们创建了一个GenericClass对象genericString,并指定了类型参数为String。

java 泛型的定义

java 泛型的定义

java 泛型的定义Java泛型是Java编程语言中的一个重要特性,它在JDK 5版本中引入,用于增强代码的类型安全性和可读性。

泛型的定义是指在定义类、接口或方法时,可以使用参数化类型,即类型参数作为变量。

通过使用泛型,可以在编译时检查类型的一致性,避免在运行时出现类型转换异常。

泛型的引入解决了Java中的类型安全性问题。

在Java中,使用Object类型可以存储任意类型的对象,但在使用这些对象时需要进行类型转换,容易出现类型转换异常。

而使用泛型后,可以在编译时检查类型的一致性,避免了类型转换异常的发生。

例如,定义一个泛型类List<T>,其中的T表示类型参数,可以是任意类型。

在使用List<T>时,可以指定T的具体类型,如List<Integer>表示存储整数类型的列表,List<String>表示存储字符串类型的列表。

这样,在编译时就可以检查出错误的类型使用,提高了代码的可靠性。

泛型不仅可以应用于类和接口的定义,还可以应用于方法的定义。

在方法中使用泛型,可以使方法具有更广泛的适用性。

例如,定义一个泛型方法printArray,用于打印数组中的元素。

方法的参数类型为T[],表示一个泛型数组,可以传入任意类型的数组。

在方法内部,可以使用T类型的变量来操作数组中的元素,而不需要进行类型转换。

这样,可以减少代码的重复性,提高代码的可读性和可维护性。

泛型还可以通过通配符来增加灵活性。

通配符表示一个未知的类型,用符号"?"表示。

通配符可以用于泛型类、泛型接口和泛型方法的定义。

通配符有上界和下界的限制,可用于限制泛型参数的类型范围。

例如,定义一个泛型类Pair<T>,其中T表示类型参数,可以是任意类型。

在定义一个方法compare,比较两个Pair对象中的元素是否相等。

方法的参数类型为Pair<?>,表示一个未知类型的Pair对象。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• •
CollectionsTest.java
3 Sept. 2008 Confidential
ቤተ መጻሕፍቲ ባይዱ
泛型的定义
泛型经常被称为参数化类型,它能够像方法一样接受不同 类型的参数。 • 定义方式为<>

ArrayList<E> ArrayList<E>
– E是类型变量 •
myArrayList ; myArrayList ;
x1) { x1) {
y1) { y1) {
Point<Integer> point1 = new Point<Integer>(4, 2);
3 Sept. 2008 Confidential
练习
• •
1、自己定义一个泛型,参考前两页的代码; 2、在自定义的泛型中试验get和set方法;

把上页的示例实现测试一下: Point.java

GenericsTest.java
3 Sept. 2008 Confidential
泛型作为变量类型使用

泛型会产生出一个新的数据类型,那么这个新的数据类型就 可以作为类型参数来使用,创建出一个新的泛型。
GenericVarTest.java import java.util.*; import java.util.*; class GenericVarTest { class GenericVarTest { public static void main(String[] args) { public static void main(String[] args) { ArrayList<String> str = new ArrayList<String> str = new ArrayList<String>(); ArrayList<String>(); str.add("aaaa"); str.add("aaaa"); str.add("bbbb"); str.add("bbbb"); ArrayList<String> str1 = new ArrayList<String> str1 = new ArrayList<String>(); ArrayList<String>(); str1.add("cccc"); str1.add("cccc"); str1.add("dddd"); str1.add("dddd");
3 Sept. 2008 Confidential
泛型中的通配符
泛型中可以使用“?”通配符作为参数,表示该泛型可以接收 任意类型的数据。 • 上界通配符:泛型中只允许一个类自身(接口)或者其子类 (实现该接口的类)作为参数传入。 – 表示方式为:泛型类型<? extends 父类(接口)> • 下界通配符:表示泛型中只允许一个类自身或者该类的父 类作为参数传入。(很少使用) – 表示方式为:泛型类型<? super 子类>。
Copyright © 2008 版权所有 东软集团
Java编程基础 ——泛型
东软IT人才实训中心
Copyright 2008 By Neusoft Group. All rights reserved
第十章 泛型
目标:
学时:0.5学时 教学方法:讲授ppt +上机练习
3 Sept. 2008 Confidential
本章要点
• • • • •
泛型的出现 泛型的定义 泛型作为变量类型使用 泛型中的通配符 创建自己的泛型
3 Sept. 2008 Confidential
泛型的出现
JDK1.4中集合在使用上的问题 – 集合中的add( )方法接受的是一个Object对象的参 数,在获取集合中的对象时,必须进行造型操作。 – 造型操作可能出现问题,一般在程序运行时才能发生, 发现问题比较困难。 • 解决之道(泛型) – 在对象放入集合前,为集合作个限制 – 在获取集合中的对象时,不用进行造型的操作 – 当有不同类型的对象添加到集合中的时候,编译时就能 检查出错误。
3 Sept. 2008 Confidential
public E getY() { public E getY() { return y; return y; } } public void setX(E public void setX(E x = x1; x = x1; } } public void setY(E public void setY(E y = y1; y = y1; } }
注意: – 无论泛型的表示形式是否相同,泛型实际上是产生了一 个新的数据类型。不同新数据类型之间不存在继承的关 系。 GenericsExample.java

3 Sept. 2008 Confidential
练习

参考示例GenericsExample.java,完成下面练 习: – 创建一个只能容纳Student类型对象的集合 – 然后向集合里面增加两个Student对象,再增 加一个String类型的对象 – 最后使用Iterator遍历输出集合的对象;

WildCardTest.java、BoundedWildcardTest.java
3 Sept. 2008 Confidential
创建自己的泛型

创建泛型和定义一个类一样,只要类型变量位于类后面的 <>中就可以。
class Point<E> { class Point<E> { E x; E x; E y; E y; public Point(E x1, E y1) { public Point(E x1, E y1) { x = x1; x = x1; y = y1; y = y1; } } public E getX() { public E getX() { return x; } return x; }
3 Sept. 2008 Confidential
程序示例(续)
ArrayList<ArrayList<String>> ArrayList<ArrayList<String>> listofStr= listofStr=
new ArrayList<ArrayList<String>>(); new ArrayList<ArrayList<String>>(); //泛型作为参数产生一个新的泛型类 //泛型作为参数产生一个新的泛型类 listofStr.add(str); listofStr.add(str); listofStr.add(str1); listofStr.add(str1); String s = listofStr.get(0).get(0); String s = listofStr.get(0).get(0); System.out.println(s); // prints"bbbb“ System.out.println(s); // prints"bbbb“ String s1 = listofStr.get(1).get(0); String s1 = listofStr.get(1).get(0); System.out.println(s1); //prints"cccc" System.out.println(s1); //prints"cccc" } } } }
3 Sept. 2008 Confidential
本章小结
• • • •
掌握泛型的特点 泛型可以作为变量类型来使用 掌握泛型中的通配符 学会创建自己的泛型
3 Sept. 2008 Confidential
术语
缩语、术语 英文全称 解 释
3 Sept. 2008 Confidential
3 Sept. 2008 Confidential
相关文档
最新文档