Java 泛型 菜鸟教程
Java中的泛型编程技巧
Java中的泛型编程技巧Java 中的泛型编程技巧随着软件系统规模的不断扩大,代码的维护成本也愈来愈高。
泛型编程(Generics Programming)正是为了解决这个问题而生的。
Java 作为一门比较成熟的编程语言,自 J2SE 5.0 版本起加入了泛型机制,使得 Java 的类型安全性得到进一步提高。
本文将介绍一些Java 中的泛型编程技巧,帮助大家编写更加清晰、简洁、安全、可复用的代码。
一、泛型基础1.1 泛型类泛型类(Generic Class)是指可以在类定义时指定类型参数的类。
泛型类可以包含普通成员变量和普通成员方法。
类型参数可以是任意类型,包括基本数据类型和引用类型。
例如:```public class MyGenericClass<T> {private T value;public void setValue(T value) {this.value = value;}public T getValue() {return value;}}```上面的代码中,T 是一个类型参数,可以被任意类型替代。
在实例化泛型类时会指定实际的类型参数,如下所示:```MyGenericClass<String> generic = new MyGenericClass<>();generic.setValue("Hello, World!");String value = generic.getValue();```1.2 泛型接口泛型接口(Generic Interface)与泛型类类似,可以在接口定义时指定类型参数。
泛型接口可以被实现为泛型类、非泛型类以及其他泛型接口。
例如:```public interface MyGenericInterface<T> {void setValue(T value);T getValue();}```可以将泛型接口用于实现非泛型类:```public class MyGenericClass<T> implements MyGenericInterface<T> {private T value;public void setValue(T value) {this.value = value;}public T getValue() {return value;}}```也可以将泛型接口用于实现其他泛型接口:```public interface MyGenericInterface2<U> extends MyGenericInterface<U> {void setOtherValue(U value);U getOtherValue();}```1.3 泛型方法泛型方法(Generic Method)是指可以在方法定义时指定类型参数的方法。
java 泛型的三种定义与使用方法
java 泛型的三种定义与使用方法Java中的泛型主要有三种定义方式,分别是:类型参数、类型参数化类和类型参数化方法。
下面是它们的定义和使用方法:1. 类型参数:类型参数是泛型的主要形式,它允许我们在定义类、接口或方法时指定一个或多个类型参数。
这些类型参数在类、接口或方法的实现中被用作类型占位符,以便在运行时确定实际类型。
定义类型参数的方法是在类、接口或方法的名称后面加上尖括号<>,并在其中指定一个或多个类型参数。
例如:```javapublic class Box<T> {private T content;public Box(T content) {= content;}public T getContent() {return content;}}```在上面的例子中,我们定义了一个名为Box的泛型类,它有一个类型参数T。
我们可以使用任何类型来实例化Box对象,例如Box<Integer>、Box<String>等。
2. 类型参数化类:类型参数化类是将一个类作为泛型参数。
这种定义方式主要用于集合框架中的类,例如List、Set、Map等。
定义类型参数化类的方法是在类名后面加上尖括号<>,并在其中指定一个或多个类型参数。
例如:```javaList<String> list = new ArrayList<>();Set<Integer> set = new HashSet<>();Map<String, Integer> map = new HashMap<>();在上面的例子中,我们定义了三个类型参数化类:List、Set和Map,并使用它们创建了三个不同类型的对象。
这些对象在运行时会自动处理实际类型的匹配。
3. 类型参数化方法:类型参数化方法是在方法中使用泛型。
Java的泛型详解(一)
Java的泛型详解(⼀)Java的泛型详解泛型的好处编写的代码可以被不同类型的对象所重⽤。
因为上⾯的⼀个优点,泛型也可以减少代码的编写。
泛型的使⽤简单泛型类public class Pair<T> {private T first;private T second;public Pair() {first = null;second = null;}public Pair(T first, T second){this.first = first;this.second = second;}public T getFirst(){return first;}public T getSecond(){return second;}public void setFirst(T first) {this.first = first;}public void setSecond(T second) {this.second = second;}}上⾯例⼦可以看出泛型变量为T;⽤尖括号(<>)括起来,并放在类名后⾯;泛型还可以定义多个类型变量⽐如上⾯的例⼦ first和second不同的类型:public class Pair<T, U> {....}注: 类型变量的定义需要⼀定的规范:(1) 类型变量使⽤⼤写形式,并且要⽐较短;(2)常见的类型变量特别代表⼀些意义:变量E 表⽰集合类型,K和V表⽰关键字和值的类型;T、U、S表⽰任意类型;类定义的类型变量可以作为⽅法的返回类型或者局部变量的类型;例如: private T first;⽤具体的类型替换类型变量就可以实例化泛型类型;例如: Pair<String> 代表将上述所有的T 都替换成了String由此可见泛型类是可以看作普通类的⼯⼚泛型⽅法我们应该如何定义⼀个泛型⽅法呢?泛型的⽅法可以定义在泛型类,也可以定义在普通类,那如果定义在普通类需要有⼀个尖括号加类型来指定这个泛型⽅法具体的类型;public class TestUtils {public static <T> T getMiddle(T... a){return a[a.length / 2];}}类型变量放在修饰符(static)和返回类型的中间;当你调⽤上⾯的⽅法的时候只需要在⽅法名前⾯的尖括号放⼊具体的类型即可;String middle = TestUtils.<String>getMiddle("a", "b", "c");如果上图这种情况其实可以省略,因为编译器能够推断出调⽤的⽅法⼀定是String,所以下⾯这种调⽤也是可以的;String middle = TestUtils.getMiddle("a", "b", "c");但是如果是以下调⽤可能会有问题:如图:可以看到变意思没有办法确定这⾥的类型,因为此时我们⼊参传递了⼀个Double3.14 两个Integer1729 和0 编译器认为这三个不属于同⼀个类型;此时有⼀种解决办法就是把整型写成Double类型类型变量的限定有时候我们不能⽆限制的让使⽤者传递任意的类型,我们需要对我们泛型的⽅法进⾏限定传递变量,⽐如如下例⼦计算数组中最下的元素这个时候是⽆法编译通过的,且编译器会报错因为我们的编译器不能确定你这个T 类型是否有compareTo这个函数,所以这么能让编译器相信我们这个T是⼀定会有compareTo呢?我们可以这么写<T extends Comparable> 这⾥的意思是T⼀定是继承Comparable的类因为Comparable是⼀定有compareTo这个⽅法,所以T⼀定有compareTo⽅法,于是编译器就不会报错了因为加了限定那么min这个⽅法也只有继承了Comparable的类才可以调⽤;如果要限定⽅法的泛型继承多个类可以加extends 关键字并⽤&分割如:T extends Comparable & Serializable限定类型是⽤&分割的,逗号来分割多个类型变量<T extends Comparable & Serializable , U extends Comparable>类型擦除不论什么时候定义⼀个泛型类型,虚拟机都会提供⼀个相应的原始类型(raw type)。
java 方法的泛型
java 方法的泛型Java方法的泛型泛型(Generics)是Java语言中一个强大的特性,它允许我们在编译时期检测类型的一致性,并且提供了更加灵活和安全的代码重用方式。
泛型在Java 5中引入,成为Java语言的一大亮点。
在本文中,我将介绍Java方法中的泛型的使用方法和注意事项。
一、泛型方法的定义和语法泛型方法是一种在方法中使用泛型类型参数的方法。
在方法的返回类型之前使用尖括号,尖括号中指定泛型类型参数。
例如,下面是一个简单的泛型方法的定义:```javapublic <T> void printArray(T[] arr) {for (T element : arr) {System.out.print(element + " ");}System.out.println();}```在上面的例子中,泛型方法printArray使用了一个类型参数T,它表示任意类型。
方法的参数arr是一个泛型数组,类型为T[]。
在方法的实现中,我们可以像操作普通数组一样遍历和处理泛型数组。
二、调用泛型方法调用泛型方法时,可以明确指定泛型类型参数,也可以根据方法参数的类型推断出泛型类型参数。
例如,下面是两种调用泛型方法的方式:```javaString[] strArr = {"Java", "Python", "C++"};printArray(strArr); // 调用泛型方法,类型参数自动推断为StringInteger[] intArr = {1, 2, 3, 4, 5};this.<Integer>printArray(intArr); // 显式指定泛型类型参数为Integer```从上面的例子中可以看出,我们既可以根据参数类型推断出泛型类型参数,也可以显式指定泛型类型参数。
这使得泛型方法在使用时非常灵活。
java 泛型创建实体对象并调用方法
java 泛型创建实体对象并调用方法下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!Java 泛型:创建实体对象并调用方法1. 引言在现代编程中,泛型是一种强大的工具,它允许我们编写通用的代码,从而提高代码的重用性和可读性。
javafan'xing的用法
"Java泛型"是一种在Java编程语言中定义泛型类型的方法。
它是一种用于编写灵活且可重用代码的技术,使得代码能够处理不同的数据类型。
泛型可以让你编写可以处理多种数据类型的代码,而不需要为每种数据类型编写新的代码。
Java泛型的用法主要包括以下步骤:
1. 定义泛型类型:使用尖括号<>来定义泛型类型,并在尖括号中指定泛型类型参数。
例如,List<E>是一个泛型类型,其中E是类型参数。
2. 创建泛型对象:使用泛型类型参数来创建对象。
例如,List<String> list = new ArrayList<String>();创建了一个String类型的List对象。
3. 使用泛型方法:在方法定义中使用泛型类型参数,以便在方法内部使用该参数来操作不同类型的对象。
例如,public static <T> T method(T arg) {return arg;}定义了一个名为method的泛型方法,它接受一个类型为T的参数并返回一个类型为T的对象。
4. 使用通配符:使用通配符来表示未知的泛型类型,以便编写更加灵活的代码。
例如,List<?> list = new ArrayList<String>();表示list 是一个未知类型的List对象,但实际上它是一个String类型的List对象。
总之,Java泛型是一种强大的工具,可以帮助你编写更加灵活、可重用和易于维护的代码。
Java泛型编程指南
此系列文章译自SUN的泛型编程指南, 看不懂译文的请看原文/j2se/1.5/pdf/generics-tutorial.pdfJava泛型编程指南一、绪言JDK1.5对JAVA语言进行了做了几个扩展,其中一个就是泛型。
本指南旨在介绍泛型。
如果你熟悉其它语言的构造类似的东西,特别是C++的模板(template),你会很快发现它们之间的相同点及重要的不同点;如果你在其他地方没看到过类似的东西,那反而更好,那样你就可以开始全新的学习,用不着去忘掉那些(对JAVA泛型)容易产生误解的东西。
泛型允许你对类型进行抽象。
最常见的例子是容器类型,比如那些在Collection层次下的类型。
下面是那类例子的典型用法:List myIntList = new LinkedList();//1myIntList.add(new Integer(0));//2Integer x = (Integer) myIntList.iterator().next();//3第3行里的强制类型转换有点烦人,程序通常都知道一个特定的链表(list)里存放的是何种类型的数据,但却一定要进行类型转换。
编译器只能保证迭代器返回的是一个对象,要保证对Integer类型变量的赋值是类型安全的话,必须进行类型转换。
类型转换不但会引起程序的混乱,还可能会导致运行时错误,因为程序员可能会犯错误。
如果程序员可以如实地表达他们的意图,即标记一个只能包含特定数据类型的链表,那会怎么样呢?这就是泛型背后的核心思想。
下面是前面代码的泛型写法:List<Integer> myIntList = new LinkedList<Integer>();//1'myIntList.add(new Integer(0));//2'Integer x = myIntList.iterator().next();//3'请注意变量myIntList的类型声明,它指明了这不仅仅是一个任意的List,还是一个Integer类型的List,写作List<Integer>。
Java泛型之上、下边界通配符的理解(适合初学)
Java泛型之上、下边界通配符的理解(适合初学)泛型的由来为什么需要泛型 Java的数据类型⼀般都是在定义时就需要确定,这种强制的好处就是类型安全,不会出现像弄⼀个ClassCastException的数据给jvm,数据安全那么执⾏的class就会很稳定。
但是假如说我不知道这个参数要传什么类型的,因为公司需求在变,如果写死的那就只能便以此需求就改⼀次,很⿇烦。
sun公司也注意到这个问题,这样会让代码的灵活性降低,他们就研究出了泛型。
泛型初识 什么是泛型,可以字⾯理解就是⼀个泛泛的类型,他是不确定的,在Java代码编译的时候⽤泛型是不会出错的,⽽在运⾏期时就会报错,说你这种第⼀是不合理的。
这是为什么呢。
因为为了提⾼灵活性,就在编译时期将条件放宽,但是泛型⼀定要在运⾏的时候告诉jvm你给我的数据到底是什么类型的,否则jvm会是懵逼的。
所以泛型的好处就是将类型的灵活性提⾼,也只是在Java语法的基础上提⾼,不过泛型还是⽐较实⽤的。
何时使⽤泛型 泛型的应⽤场景就是应⽤在模型(可以理解为存储数据的盒⼦),我为了这个盒⼦适⽤更多的地⽅我就⽤将需要存⼊的数据⽤⼀个泛型表⽰,当然可以传⼊多值。
如果是相同类型的对象就⽤⼀个泛型的数组⽐较好,学过集合的⼩伙伴应该都知道,没学过的那你应该补补课了。
泛型的语法public class A<T extends B>{T t;}泛型的缺点或者为什么需要上、下边界 泛型的虽然强⼤,但是世界上任何东西东部是完美的。
它也有缺陷。
⽐如说我有⼀个盒⼦我想装苹果,但是我还可能想装⾹蕉那怎么办。
那还不好说,在给⼀个参数不就⾏了,那⼗个呢,⼆⼗个呢。
em....的确是。
如果说我们想装的东西都属于⼀个类并且只要是这个类的⼦类就可以装。
这个想法sun为我们想好了。
那就是⽤上边界通配符。
语法是 T是泛型,M是T的⽗类。
我们就定义⼀个⽔果类(Fruit),盛装就容器就是盘⼦(Dish),现在我们就可以装任何⽔果了,不错吧!上边界Java代码public class Dish<T extends Fruit>{private T fruitChild;public Dish(T fruitChild){this.fruitChild = fruitChild;}public T getFruitChild(){return fruitChild;}public void setFruitChild(T f){this.fruitChild = f;}public static void main(String[] args){Dish dish = new Dish<apple>();Apple apple = new apple(); //apple must be Fruit child;dish.setFruitChild(apple);system.out.printf(dish.getFruitChild);}}下边界Java代码public class Dish<T super Apple>{private T appleFather;public Dish(T appleFather){this.appleFather = appleFather;}什么是上边界通配符 当泛型T 给定形如 的A 类型到A 类型任何⼦类的限制域,可以匹配任何在此限制域中的类型,此种表⽰叫上边界通配符。
Java基础_泛型详解
Java基础_泛型详解⼀:什么是 java 泛型?Java 泛型实质就是⼀种语法约束,泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为⼀个参数,这种参数类型可以⽤在类、接⼝和⽅法的创建中,分别称为泛型类、泛型接⼝、泛型⽅法。
⼆:泛型的核⼼原理是什么?泛型的核⼼原理其实就是泛型的 T 类型参数的原理,Java 编译器在编译阶段会将泛型代码转换为普通的⾮泛型代码,实质就是擦除类型参数 T 替换为限定类型(上限类型或者下限类型)(⽆限定类型替换为Object)且插⼊必要的强制类型转换操作,同时 java 编译器是通过先检查代码中泛型的类型然后再进⾏类型擦除,最后进⾏编译的。
编译器在编译时擦除所有类型相关信息,所以在运⾏时不存在任何类型相关信息,例如List在运⾏时仅⽤⼀个List来表⽰,这样做的⽬的是确保能和 Java 5 之前的版本开发⼆进制类库进⾏兼容,我们⽆法在运⾏时访问到类型参数,因为编译器已经把泛型类型转换成了原始类型。
三:泛型的好处是什么?泛型的好处其实就是约束,可以让我们编写的接⼝、类、⽅法等脱离具体类型限定⽽适⽤于更加⼴泛的类型,从⽽使代码达到低耦合、⾼复⽤、⾼可读、安全可靠的特点,避免主动向下转型带来的恶⼼可读性和隐晦的转换异常,尽可能的将类型问题暴露在 IDE 提⽰和编译阶段。
四:泛型类⼀般的类只能使⽤具体的类型,要么是基本类型,要么是⾃定义类型。
如果要编写可以⽤于多种类型的类呢?那么我们是不是可以想到⽤Object来定义类型,的确,⽤Object完全可以实现存储任何类型的对象,但是我们在使⽤容器的时候⼜想约束容器持有某种类型的对象。
因此,与其使⽤Object,我们更喜欢暂时不指定类型,⽽是稍后再决定具体使⽤什么类型。
要达到此⽬的,需要使⽤泛型参数,⽤尖括号括住,放在类名后⾯,然后在使⽤这个类的时候,再⽤实际的类型替换此参数类型即可public class FanXing<T> {public T t;public T getT() {return t;}public FanXing(T t) {this.t = t;}public static void main(String[] args) {FanXing<String> fx1 = new FanXing<>("a");FanXing<Integer> fx2 = new FanXing<>(1);System.out.println(fx1.getT().getClass()); //ng.StringSystem.out.println(fx2.getT().getClass()); //ng.Integer}}五:泛型接⼝public interface IFanXing<T1, T2> {T1 show1(T2 t);T2 show2(T1 t);}public class FanXing implements IFanXing<String, Integer> {@Overridepublic String show1(Integer t) {return String.valueOf(t);}@Overridepublic Integer show2(String t) {return Integer.valueOf(t);}public static void main(String[] args) {FanXing fanXing = new FanXing();System.out.println(fanXing.show1(1)); //1System.out.println(fanXing.show2("1")); //1}}六:泛型⽅法到⽬前为⽌,我们看到的泛型,都是应⽤于整个类上。
java泛型详解-绝对是对泛型方法讲解最详细的,没有之一
java泛型详解-绝对是对泛型⽅法讲解最详细的,没有之⼀1. 概述泛型在java中有很重要的地位,在⾯向对象编程及各种设计模式中有⾮常⼴泛的应⽤。
什么是泛型?为什么要使⽤泛型?泛型,即“参数化类型”。
⼀提到参数,最熟悉的就是定义⽅法时有形参,然后调⽤此⽅法时传递实参。
那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于⽅法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使⽤/调⽤时传⼊具体的类型(类型实参)。
泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。
也就是说在泛型使⽤过程中,操作的数据类型被指定为⼀个参数,这种参数类型可以⽤在类、接⼝和⽅法中,分别被称为泛型类、泛型接⼝、泛型⽅法。
2. ⼀个栗⼦⼀个被举了⽆数次的例⼦:1 List arrayList = new ArrayList();2 arrayList.add("aaaa");3 arrayList.add(100);45for(int i = 0; i< arrayList.size();i++){6 String item = (String)arrayList.get(i);7 Log.d("泛型测试","item = " + item);8 }毫⽆疑问,程序的运⾏结果会以崩溃结束:1 ng.ClassCastException: ng.Integer cannot be cast to ng.StringArrayList可以存放任意类型,例⼦中添加了⼀个String类型,添加了⼀个Integer类型,再使⽤时都以String的⽅式使⽤,因此程序崩溃了。
为了解决类似这样的问题(在编译阶段就可以解决),泛型应运⽽⽣。
我们将第⼀⾏声明初始化list的代码更改⼀下,编译器会在编译阶段就能够帮我们发现类似这样的问题。
Java 泛型 菜鸟教程
Array characterArray contains: HELLO
有界的类型参数: 可能有时候,你会想限制那些被允许传递到一个类型参数的类型种类范围。例如,一个操作数字的方法可能只希望接受 Number或者Number子类的实例。这就是有界类型参数的目的。 要声明一个有界的类型参数,首先列出类型参数的名称,后跟extends关键字,最后紧跟它的上界。
实例
如下实例演示了我们如何定义一个泛型类:
public class Box<T> {
private T t;
public void add(T t) { this.t = t;
}
public T get() { return t;
}
public static void main(String[] args) { Box<Integer> integerBox = new Box<Integer>(); Box<String> stringBox = new Box<String>();
} }
编译以上代码,运行结果如下所示:
Maximum of 3, 4 and 5 is 5
Maximum of 6.6, 8.8 and 7.7 is 8.8
Maximum of pear, apple and orange is pear
泛型类
泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。 和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一 个类型变量,是用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的 类型。
java泛型详解
Java 泛型详解泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用。
本文我们将从零开始来看一下Java 泛型的设计,将会涉及到通配符处理,以及让人苦恼的类型擦除。
泛型基础泛型类我们首先定义一个简单的Box类:public class Box { private String object; public void set(String object) { this.object = object; } public String get() { return object; }}这是最常见的做法,这样做的一个坏处是Box里面现在只能装入String类型的元素,今后如果我们需要装入Integer等其他类型的元素,还必须要另外重写一个Box,代码得不到复用,使用泛型可以很好的解决这个问题。
public class Box { // T stands for 'Type' private T t; public void set(T t) { this.t = t; } public T get() { return t; }}这样我们的Box类便可以得到复用,我们可以将T替换成任何我们想要的类型:Box integerBox = new Box();Box doubleBox = newBox();Box stringBox = new Box();泛型方法看完了泛型类,接下来我们来了解一下泛型方法。
声明一个泛型方法很简单,只要在返回类型前面加上一个类似的形式就行了:public class Util { public static boolean compare(Pair p1, Pair p2) { returnp1.getKey().equals(p2.getKey()) &&p1.getValue().equals(p2.getValue()); }}public classPair { private K key; private V value; publicPair(K key, V value) { this.key = key;this.value = value; } public void setKey(K key){ this.key = key; } public void setValue(V value){ this.value = value; } public K getKey() { return key; } public V getValue() { return value; }}我们可以像下面这样去调用泛型方法:Pair p1 = new Pair(1, 'apple');Pair p2 = new Pair(2,'pear');boolean same = pare(p1, p2);或者在Java1.7/1.8利用type inference,让Java自动推导出相应的类型参数:Pair p1 = new Pair(1, 'apple');Pair p2 = new Pair(2,'pear');boolean same = pare(p1, p2);边界符现在我们要实现这样一个功能,查找一个泛型数组中大于某个特定元素的个数,我们可以这样实现:public static int countGreaterThan(T[] anArray, T elem) { int count = 0; for (T e : anArray) if (e > elem) // compiler error ++count; return count;}但是这样很明显是错误的,因为除了short, int, double, long, float, byte, char等原始类型,其他的类并不一定能使用操作符>,所以编译器报错,那怎么解决这个问题呢?答案是使用边界符。
java中的泛型【T】与通配符【?】概念入门
java中的泛型【T】与通配符【?】概念⼊门使⽤泛型的⽬的是利⽤Java编译机制,在编译过程中帮我们检测代码中不规范的有可能导致程序错误的代码。
例如,我们都知道List容器可以持有任何类型的数据,所以我们可以把String和Integer等类型同时放⼊同⼀个List容器中,但是这种做法是极其危险的。
在泛型机制中,这种操作就会导致编译不通过,会强制要求你将List容器中的数据类型修改为统⼀类型。
这种机制可以帮助我们减少程序运⾏中隐藏的Bug。
泛型【T】泛型在代码中使⽤⼴泛。
泛型的⽤法根据泛型使⽤的位置,即使⽤在类(Class),属性(Field)和⽅法(Method)的不同位置,可以将泛型的⽤法总结为以下⼏种:1.泛型类。
在类名后添加泛型标识(<T...>),⽤于表⽰该类持有的⼀种类型。
2.泛型属性。
泛型属性必须结合泛型类使⽤,⽤于接收泛型类持有的类型T。
3.泛型⽅法。
在⽅法的返回值前声明泛型(<T extends ⽗类名>),该泛型是对该⽅法的参数T的⼀种限定。
泛型⽤法的补充1.如果泛型T没有被extends修饰(包括类和⽅法),我们称之为⽆界泛型;如果被extend修饰,我们就称之为有界泛型。
2.如果⽅法参数中有泛型T,⽽⽅法的返回类型前没有泛型T,该类型就不是泛型⽅法,⽽是泛型类。
3.泛型⽅法常⽤在⼯具类中(即该⽅法只是⼀种⼯具),与类的实例对象⽆关。
4.当泛型⽅法中的泛型T与类中的泛型T同名时会产⽣警报,因为编译器不确定你要使⽤哪个持有对象。
有界泛型相较于⽆界泛型(没有限定类型)的⽤法,我们可以使⽤有界泛型(<T extends ⽗类名>)来限定持有对象的范围,或泛型⽅法传⼊该⽅法参数的范围,以此保证业务逻辑的正确执⾏。
有界泛型只有上界(extends),⽽没有下界的⽤法(相对于通配符【?】)。
泛型中的继承⽤⼀段代码说明泛型中继承的使⽤。
ArrayList<String> arrayList = new ArrayList<>();Object object = new Object();arrayList.add(object); // 编译器报错因为 ArrayList<String>不是 ArrayList<Object>的⼦类,因此编译器会报错,错误信息为The method add(String) in the type ArrayList<String> is not applicable for the arguments (Object)。
java 泛型函数的定义和使用
java 泛型函数的定义和使用Java是一种面向对象的编程语言,拥有强大的泛型机制。
泛型函数是一种特殊的函数,可以在定义时使用泛型参数,从而实现对不同类型的数据进行操作。
本文将介绍泛型函数的定义和使用方法。
一、泛型函数的定义在Java中,泛型函数的定义需要在函数名之前使用尖括号<>来声明泛型参数。
泛型参数可以是任意合法的标识符,通常使用大写字母表示。
泛型参数可以在函数的参数列表、返回值类型和函数体中使用,用于表示某种未知的数据类型。
下面是一个简单的泛型函数的定义示例:```public <T> void printArray(T[] array) {for (T item : array) {System.out.println(item);}}```在上述代码中,`<T>`表示泛型参数,`printArray`函数的参数`array`是一个类型为`T`的数组。
在函数体中,可以使用`T`来表示数组中的元素类型。
二、泛型函数的使用泛型函数可以像普通函数一样被调用,但在调用时需要指定实际的类型参数。
可以使用尖括号<>在函数名后面传入实际的类型参数。
下面是一个使用泛型函数的示例:```Integer[] intArray = {1, 2, 3, 4, 5};String[] stringArray = {"Hello", "World"};printArray(intArray); // 调用printArray函数,传入Integer[]类型的参数printArray(stringArray); // 调用printArray函数,传入String[]类型的参数```在上述代码中,分别定义了一个整型数组`intArray`和一个字符串数组`stringArray`。
然后调用了`printArray`函数两次,分别传入了`intArray`和`stringArray`作为参数。
Java基础入门教程(适合所有菜鸟)
第2章 Java语言开发环境 6 2.1 JDK 62.1.1 JDK的简介62.1.2 JDK的构成62.1.3 JDK的使用62.2 IDE 82.2.1 IDE简介82.2.2 JBuilder 92.2.3 Eclipse 92.2.4 相关资源92.3 Project管理92.3.1 Project的含义92.3.2 可行的Project组织模式 9102.4 本章小结 10习题10第1章 Java语言概述与面向对象思想1.1 Java语言的开展1.1.1 Java语言的产生上世纪90年代初期,Sun公司在研究一种适用于未来的智能设备的编程语言,该语言要具有一些新的特性,以防止C++的一些缺乏。
该语言起初命名为Oak,来源于语言作者Gosling办公室窗外的一棵橡树〔Oak〕。
后来在注册时候遇到了冲突,于是就从手中的热咖啡联想到了印度尼西亚一个盛产咖啡的岛屿,中文名叫爪哇,Java语言得名于此。
随着Internet的迅速开展,Web应用日益广泛,Java语言也得到了迅速开展。
1994年,Gosling用Java开发了一个实时性较高、可靠、平安、有交互功能的新型Web浏览器,它不依赖于任何硬件平台和软件平台。
这种浏览器名称为HotJava,并于1995年同Java语言一起,正式在业界对外发表,引起了巨大的轰动,Java的地位随之而得到肯定。
此后的开展非常迅速。
Java编程语言的句法与C++的句法相似,语义那么与Small Talk TM的语义相似。
Java编程语言可被用来创立任何常规编程语言所能创立的应用程序。
设计Java编程语言的主要目标是:提供一种易于编程的语言,从而消除其它语言在诸如指针运算和存储器管理方面影响健壮性的缺陷。
利用面向对象的概念使程序真正地成为完全面向对象的程序。
为获得如下两点益处提供一种解释环境:提高开发速度──消除编译─链接—装载—测试周期;代码可移植性──使操作系统能为运行环境做系统级调用。
Java泛型技术详细教程
Java泛型技术详细教程
初级
共7节课
在本套课程中,们将全面的讲解JAVA泛型技术,从JAVA推出泛型的背景到泛型的常见使用和应用,再到泛型的设计原理,最后到泛型的高级使用;整个教学结合一系列的应用案例,由浅入深,由到面的讲解了整个泛型体系
下载完整(已有4569人下载)
1、课程简介
泛型JAVA在JDK5中引入的新特性,在后续的JDK版本中,泛型更得到了广泛的推广和使用,尤其在集合框架,面向对象编程和设计模式这块,泛型的优势体现的淋漓尽致。
所以,深入的理解泛型,对于们阅读JDK集合框架源码,和设计模式的学习,会起到事半功倍的。
在本套课程中,们将全面的讲解JAVA泛型技术,从JAVA推出泛型的背景到泛型的常见使用和应用,再到泛型的设计原理,最后到泛型的高级使用;整个教学结合一系列的应用案例,由浅入深,由到面的讲解了整个泛型体系。
2、适应人群
有一定的Java基础,想要对泛型深入学习的同学。
3、主讲内容
(1)什么泛型?
(2)泛型类、接口
(3)泛型方法
(4)类型通配符
(5)类型擦除
(6)泛型和数组(7)泛型和反。
Java泛型详解(超详细的java泛型方法解析)
Java泛型详解(超详细的java泛型⽅法解析)⽬录2. 什么是泛型3. 使⽤泛型的好处4. 泛型的使⽤4.1 泛型类4.2 泛型⽅法4.3 泛型接⼝5. 泛型通配符5.1 通配符基本使⽤5.2 通配符⾼级使⽤6. 总结1. 为什么使⽤泛型早期的Object类型可以接收任意的对象类型,但是在实际的使⽤中,会有类型转换的问题。
也就存在这隐患,所以Java提供了泛型来解决这个安全问题。
来看⼀个经典案例:public static void main(String[] args) {//测试⼀下泛型的经典案例ArrayList arrayList = new ArrayList();arrayList.add("helloWorld");arrayList.add("taiziyenezha");arrayList.add(88);//由于集合没有做任何限定,任何类型都可以给其中存放for (int i = 0; i < arrayList.size(); i++) {//需求:打印每个字符串的长度,就要把对象转成String类型String str = (String) arrayList.get(i);System.out.println(str.length());}}运⾏这段代码,程序在运⾏时发⽣了异常:Exception in thread "main" ng.ClassCastException: ng.Integer cannot be cast to ng.String发⽣了数据类型转换异常,这是为什么?由于ArrayList可以存放任意类型的元素。
例⼦中添加了⼀个String类型,添加了⼀个Integer类型,再使⽤时都以String的⽅式使⽤,导致取出时强制转换为String类型后,引发了ClassCastException,因此程序崩溃了。
java list 泛型方法
java list 泛型方法Java中的List是一种常用的集合类型,它可以存储任意类型的对象,并且可以动态地调整大小。
在使用List的过程中,我们经常会遇到需要对List中的元素进行操作的情况。
泛型方法为我们提供了一种解决方案,它可以在不同的数据类型上进行操作,提高代码的复用性和灵活性。
我们需要了解什么是泛型方法。
泛型方法是一种在方法中使用类型参数的技术,它可以使方法在不同的数据类型上进行操作,而不是针对特定的数据类型。
通过在方法的返回类型前添加类型参数,我们可以定义一个泛型方法。
例如,下面是一个简单的泛型方法的示例:```javapublic <T> void printList(List<T> list) {for (T element : list) {System.out.println(element);}}```在上面的代码中,我们使用了类型参数`<T>`来表示泛型类型。
方法的参数`List<T> list`表明该方法可以接受任意类型的List对象。
在方法体内部,我们使用了一个增强的for循环来遍历List中的元素,并使用`System.out.println()`方法将元素打印出来。
泛型方法可以解决许多常见的问题。
例如,我们可以使用泛型方法来在List中查找某个特定的元素。
下面是一个示例:```javapublic <T> boolean containsElement(List<T> list, T element) {for (T obj : list) {if (obj.equals(element)) {return true;}}return false;}```在上面的代码中,我们定义了一个泛型方法`containsElement()`,它接受一个List对象和一个要查找的元素作为参数。
在方法体内部,我们使用了`equals()`方法来比较List中的每个元素是否与要查找的元素相等,如果找到了相等的元素,则返回true,否则返回false。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如下实例演示了我们如何定义一个泛型类:
public class Box<T> {
private T t;
public void add(T t) { this.t = t;
}
public T get() { return t;
}
public static void main(String[] args) { Box<Integer> integerBox = new Box<Integer>(); Box<String> stringBox = new Box<String>();
} }
编译以上代码,运行结果如下所示:
Maximum of 3, 4 and 5 is 5
Maximum of 6.6, 8.8 and 7.7 is 8.8
Maximum of pear, apple and orange is pear
泛型类
泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。 和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一 个类型变量,是用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的 类型。
System.out.println( "\nArray characterArray contains:" ); printArray( charArray ); // 传递一个字符型型数组 } }
编译以上代码,运行结果如下所示:
Array integerArray contains: 123456
实例
下面的例子演示了"extends"如何使用在一般意义上的意思"extends"(类)或者"implements"(接口)。该例子中的泛型方 法返回三个可比较对象的最大值。
public class MaximumTest {
// lt;T extends Comparable<T>> T maximum(T x, T y, T z) {
3, 4, 5, maximum( 3, 4, 5 ) );
System.out.printf( "Maxm of %.1f,%.1f and %.1f is %.1f\n\n", 6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) );
System.out.printf( "Max of %s, %s and %s is %s\n","pear", "apple", "orange", maximum( "pear", "apple", "orange" ) );
Java 泛型
如果我们只写一个排序方法,就能够对整形数组、字符串数组甚至支持排序的任何类型的数组进行排序,这该多好啊。
Java泛型方法和泛型类支持程序员使用一个方法指定一组相关方法,或者使用一个类指定一组相关的类型。
Java泛型(generics)是JDK 5中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测 到非法的类型。
使用Java泛型的概念,我们可以写一个泛型方法来对一个对象数组排序。然后,调用该泛型方法来对整型数组、浮点数数 组、字符串数组等进行排序。
泛型方法
你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每 一个方法调用。
下面是定义泛型方法的规则:
所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面 例子中的<E>)。 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是 用于指定一个泛型类型名称的标识符。 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。 泛型方法方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的 等)。
integerBox.add(new Integer(10)); stringBox.add(new String("Hello World"));
System.out.printf("Integer Value :%d\n\n", integerBox.get());
System.out.printf("String Value :%s\n", stringBox.get()); } }
}
public static void main( String args[] ) {
// 创建不同类型数组: Integer, Double 和 Character Integer[] intArray = { 1, 2, 3, 4, 5 }; Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 }; Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
实例
下面的例子演示了如何使用泛型方法打印不同字符串的元素:
public class GenericMethodTest {
// 泛型方法 printArray public static < E > void printArray( E[] inputArray ) {
// 输出数组元素 for ( E element : inputArray ){ System.out.printf( "%s ", element ); } System.out.println();
编译以上代码,运行结果如下所示:
Integer Value :10
String Value :Hello World
Array doubleArray contains: 1.1 2.2 3.3 4.4
Array characterArray contains: HELLO
有界的类型参数: 可能有时候,你会想限制那些被允许传递到一个类型参数的类型种类范围。例如,一个操作数字的方法可能只希望接受 Number或者Number子类的实例。这就是有界类型参数的目的。 要声明一个有界的类型参数,首先列出类型参数的名称,后跟extends关键字,最后紧跟它的上界。
System.out.println( "Array integerArray contains:" ); printArray( intArray ); // 传递一个整型数组
System.out.println( "\nArray doubleArray contains:" ); printArray( doubleArray ); // 传递一个双精度型数组
T max = x; // 假设x是初始最大值 if ( pareTo( max ) > 0 ){
max = y; //y 更大 } if ( pareTo( max ) > 0 ){
max = z; // 现在 z 更大 } return max; // 返回最大对象 } public static void main( String args[] ) { System.out.printf( "Max of %d, %d and %d is %d\n\n",