java1.5范性

合集下载

8-jav_1.5新特新

8-jav_1.5新特新
1、jdk1.5出现的新特性---->增强for循环
增强for循环的作用: 简化迭代器的书写格式。(注意:增强for循环的底层还是使用了迭代器遍历。)
增强for循环的适用范围: 如果是实现了Iterable接口的对象或者是数组对象都可以使用增强for循环。
增强for循环的格式:
for(数据类型 变量名 :遍历的目标){
//集合: 集合是可以存储任意对象类型数据的容器。
ArrayList list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
//自动装箱: 自动把java的基本数据类型数据转换成对象类型数据。
3. 普通for循环与增强for循环的区别:普通for循环可以没有变量的目标,而增强for循环一定要有变量的目标。
//注意: Map集合没有实现Iterable接口,所以map集合不能直接使用增强for循环,如果需要使用增强for循环需要借助于Collection的集合。
2、dk1.5新特性之------->可变参数
int temp = 10; //基本数据类型
Integer b =temp; //a存储的值赋予给b变量。 //自动拆箱: 把引用类型的数据转换成基本类型的数据
4、jdk1.5新特性之-----枚举
问题:某些方法所接收的数据必须是在固定范围之内的,
解决方案: 这时候我们的解决方案就是自定义一个类,然后是私有化构造函数,在自定义类中创建本类的对象对外使用。
System.out.println("把整数转换成对应 的字符串:"+Integer.toString(i));

java泛型实现原理

java泛型实现原理

Java泛型是Java编程语言中的一种特性,它允许程序员创建具有类型参数的类、接口和方法,以便在编译时强制执行类型安全性。

泛型的实现原理可以分为以下几个关键方面:1.类型擦除:Java中的泛型是通过类型擦除来实现的。

这意味着在编译时,泛型类型会被擦除为其边界类型或者Object类型。

这样做是为了保持与Java早期版本的兼容性,并且避免了在运行时额外生成大量的重复类。

2.类型参数转换:在类型擦除之后,泛型类中的类型参数会被转换为相应的边界类型或者Object类型。

编译器会插入必要的类型转换代码,以确保在运行时可以正确地处理类型。

3.类型擦除的影响:由于类型擦除的影响,泛型类中的参数化类型信息在运行时是不可用的。

这意味着在运行时,无法直接访问泛型类的参数化类型信息,而只能访问其擦除后的类型。

4.类型边界和限制:泛型中的类型边界和限制规定了泛型类型可以接受的类型范围。

这些边界可以是类、接口或者其他类型,用于限制泛型的类型参数必须满足特定的条件。

5.类型安全性和编译时检查:泛型的主要目的是为了提高类型安全性,并且在编译时进行类型检查,以确保类型的一致性。

这样可以在编译时捕获许多类型错误,并防止运行时出现类型相关的异常。

6.通配符和边界通配符:Java中的泛型还支持通配符和边界通配符,用于处理一些特定的泛型类型。

通配符允许程序员在泛型中使用未知类型,而边界通配符则允许限制通配符的类型范围。

Java泛型是Java编程语言中一个强大的特性,它提供了一种类型安全的编程方式,可以在编译时捕获许多潜在的类型错误。

尽管Java的泛型是通过类型擦除来实现的,但它仍然提供了许多有用的功能,使得Java编程更加灵活和可靠。

java泛型定义

java泛型定义

java泛型定义
Java泛型是一种在编译时实现类型安全的特性,它允许我们在定义类、接口和方法时使用类型参数。

通过使用泛型,我们可以在编译时发现类型不匹配的错误,从而避免了在运行时出现类型转换异常的情况。

在Java中,泛型是通过在类名或方法名后面添加尖括号(`<`和`>`)来实现的。

泛型类型参数可以是任何有效的Java标识符,通常使用单个大写字母来表示。

例如,`<T>`表示类型参数,`<E>`表示元素类型。

泛型类型参数可以在类、接口和方法中使用。

在类或接口中使用泛型时,我们可以在类或接口名后面添加尖括号,并在括号中指定类型参数。

例如,我们可以定义一个泛型类`List<T>`,其中`T`表示列表中的元素类型。

在方法中使用泛型时,我们可以在方法名和参数列表之间添加尖括号,并在括号中指定类型参数。

例如,我们可以定义一个泛型方法`public <T> T get(int index)`,其中`T`表示方法返回值的类型。

除了定义泛型类和方法外,我们还可以使用泛型通配符来限制类型参数的范围。

通配符可以使用`?`表示,例如`List<?>`表示元素类型未知的列表。

总之,Java泛型是一个非常强大的特性,它可以帮助我们写出更加类型安全、可读性更好的代码。

在使用泛型时,我们应该了解泛型的基本概念和语法,以便正确地定义和使用泛型。

java 调用泛型类型的方法

java 调用泛型类型的方法

java 调用泛型类型的方法Java是一种面向对象的编程语言,它提供了丰富的特性和工具来处理各种类型的数据。

其中,泛型是Java中非常重要的一项特性,它可以在编译时检查类型安全性,并提供了一种灵活的方式来处理不同类型的数据。

在Java中,如果我们想要调用泛型类型的方法,需要遵循一些特定的规则和语法。

首先,我们需要在调用方法时指定具体的类型参数。

例如,如果我们有一个泛型方法如下:```javapublic <T> void printArray(T[] array) {for (T element : array) {System.out.println(element);}}```我们可以通过以下方式调用该方法:```javaInteger[] intArray = {1, 2, 3, 4, 5};printArray(intArray);```在这个例子中,我们使用了Integer类型的数组作为参数来调用printArray方法。

由于在调用方法时指定了具体的类型参数,编译器会进行类型检查,以确保传递的参数类型与方法定义的类型参数一致。

除了直接指定类型参数,Java还提供了一种通配符的方式来调用泛型类型的方法。

通配符可以用来表示任意类型,可以增加代码的灵活性。

例如,我们可以修改printArray方法如下:```javapublic void printList(List<?> list) {for (Object element : list) {System.out.println(element);}}```在这个例子中,我们使用了通配符"?"来表示任意类型。

我们可以通过以下方式调用printList方法:```javaList<String> stringList = new ArrayList<>();stringList.add("hello");stringList.add("world");printList(stringList);```在这个例子中,我们使用了String类型的List作为参数来调用printList方法。

java 泛型写法

java 泛型写法

Java中的泛型(Generics)是一种允许在定义类、接口和方法时使用类型参数的功能。

类型参数是在实际使用时才确定的具体类型。

这使得代码更加灵活和可重用。

下面是一些Java泛型的常见写法:定义泛型类javapublic class Box<T> {private T t;public void set(T t) {this.t = t;}public T get() {return t;}}在这个例子中,Box类使用了一个类型参数T,可以用来存储任何类型的对象。

在类的定义中,T被用作成员变量、方法参数和返回类型的类型。

定义泛型接口javapublic interface Comparable<T> {int compareTo(T o);}在这个例子中,Comparable接口使用了一个类型参数T,表示可以比较的对象类型。

接口中的方法compareTo()使用T作为参数类型。

定义泛型方法javapublic class Utility {public static <T> void print(T input) {System.out.println(input);}}在这个例子中,print()方法使用了一个类型参数T,表示可以打印任何类型的对象。

在方法定义中,<T>出现在返回类型之前,表示这是一个泛型方法。

方法参数和返回类型都使用了T作为类型。

类型参数的限定有时我们需要限制类型参数的范围,以确保泛型代码的正确性。

可以使用extends关键字来限定类型参数的范围。

例如:javapublic class NumberBox<T extends Number> {private T t;public void set(T t) {this.t = t;}public T get() {return t;}}在这个例子中,NumberBox类使用了一个类型参数T,但是限制了它必须是Number类或其子类的实例。

JDK1.5 1.6 .17新增功能详解

JDK1.5 1.6 .17新增功能详解

JDK1.5新特性介绍1.泛型(Generic)C++通过模板技术可以指定集合的元素类型,而Java在1.5之前一直没有相对应的功能。

一个集合可以放任何类型的对象,相应地从集合里面拿对象的时候我们也不得不对他们进行强制得类型转换。

猛虎引入了泛型,它允许指定集合里元素的类型,这样你可以得到强类型在编译时刻进行类型检查的好处。

编译器会给出一个错误:2.For-Each循环For-Each循环得加入简化了集合的遍历。

假设我们要遍历一个集合对其中的元素进行一些处理。

典型的代码为:使用For-Each循环,我们可以把代码改写成:这段代码要比上面清晰许多,并且避免了强制类型转换。

3.自动装包/拆包(Autoboxing/unboxing)自动装包/拆包大大方便了基本类型数据和它们包装类地使用。

自动装包:基本类型自动转为包装类.(int>>Integer)自动拆包:包装类自动转为基本类型.(Integer>>int)在JDK1.5之前,我们总是对集合不能存放基本类型而耿耿于怀,现在自动转换机制解决了我们的问题。

这里Integer先自动转换为int进行加法运算,然后int再次转换为Integer.4.枚举(Enums)JDK1.5加入了一个全新类型的“类”-枚举类型。

为此JDK1.5引入了一个新关键字enmu.我们可以这样来定义一个枚举类型。

编译器会给出一个错误:2.For-Each循环For-Each循环得加入简化了集合的遍历。

假设我们要遍历一个集合对其中的元素进行一些处理。

典型的代码为:使用For-Each循环,我们可以把代码改写成:这段代码要比上面清晰许多,并且避免了强制类型转换。

3.自动装包/拆包(Autoboxing/unboxing)自动装包/拆包大大方便了基本类型数据和它们包装类地使用。

自动装包:基本类型自动转为包装类.(int>>Integer)自动拆包:包装类自动转为基本类型.(Integer>>int)在JDK1.5之前,我们总是对集合不能存放基本类型而耿耿于怀,现在自动转换机制解决了我们的问题。

java+泛型

java+泛型

浅谈Java泛型编程原文地址:/thread.jspa?messageID=154504我原本想全文翻译Generics in the Java Programming Language,但是功力不够,太耗时间。

于是乎按照原文的框架,翻了一些再加上自己写的一点东西。

第一次写文,如有谬误还清指出~~谢谢!浅谈Java泛型编程1 引言在JDK 1.5中,几个新的特征被引入Java语言。

其中之一就是泛型(generics)。

泛型(generics,genericity)又称为“参数类型化(parameterized type)”或“模板(templates)”,是和继承(inheritance)不同而互补的一种组件复用机制。

继承和泛型的不同之处在于——在一个系统中,继承层次是垂直方向,从抽象到具体,而泛型是水平方向上的。

当运用继承,不同的类型将拥有相同的接口,并获得了多态性;当运用泛型,将拥有许多不同的类型,并得以相同的算法作用在它们身上。

因此,一般说来,当类型与实现方法无关时,使用泛型;否则,用继承。

泛型技术最直接联想到的用途就是建立容器类型。

下面是一个没有使用泛型技术的例子:List myIntList = new LinkedList();// 1myIntLikst.add(new Integer(0));// 2Integer x = (Integer)myIntList.iterator().next();// 3显然,程序员知道究竟是什么具体类型被放进了myIntList中。

但是,第3行的类型转换(cast)是必不可少的。

因为编译器仅仅能保证iterator返回的是Object类型。

要想保证将这个值传给一个Integer类型变量是安全的,就必须类型转换。

除了使代码显得有些混乱外,类型转换更带来了运行时错误的可能性。

因为程序员难免会犯错误。

使用了泛型技术,程序员就可以确切地表达他们的意图,并且把myIntList限制为包含一种具体类型。

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泛型详解-绝对是对泛型⽅法讲解最详细的,没有之⼀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泛型(中英文)

java泛型(中英文)
List myIntList = new LinkedList();// 1 myIntList.add(new Integer(0));// 2 Integer x = (Integer) myIntList.iterator().next();// 3
第3行的类型转换有些烦人。通常情况下,程序员知道一个特定的 list 里边放的是 什么类型的数据。 但是, 这个类型转换是必须的(essential)。 编译器只能保证 iterator 返回的是 Object 类型。为了保证对 Integer 类型变量赋值的类型安全,必须进行类型 转换。 当然,这个类型转换不仅仅带来了混乱,它还可能产生一个运行时错误(run time error),因为程序员可能会犯错。 程序员如何才能明确表示他们的意图, 把一个 list 中的内容限制为一个特定的数据 类型呢?这是 generics 背后的核心思想。这是上面程序片断的一个泛型版本:
1.
介绍
JDK1.5中引入了对 java 语言的多种扩展,泛型(generics)即其中之一。 这个教程的目标是向您介绍 java 的泛型(generic)。你可能熟悉其他语言的泛型, 最著名的是 C++的模板(templates)。如果这样,你很快就会Байду номын сангаас到两者的相似之处和 重要差异。如果你不熟悉相似的语法结构,那么更好,你可以从头开始而不需要忘记误 解。 Generics 允许对类型进行抽象 (abstract over types)。最常见的例子是集合类 型(Container types),Collection 的类树中任意一个即是。 下面是那种典型用法:
那么 G<Foo>是 G<Bar>的子类型并不成立!! 这可能是你学习泛型中最难理解的部分,因为它和你的直觉相反。 这种直觉的问题在于它假定这个集合不改变。我们的直觉认为这些东西都不可改 变。 举例来说,如果一个交通部 (DMV)提供一个驾驶员里表给人口普查局,这似乎很 合理。我们想,一个 List<Driver> 是一个 List<Person> ,假定 Driver 是 Person 的子类型。实际上,我们传递的是一个驾驶员注册的拷贝。然而,人口普查局可能往驾 驶员 list 中加入其他人,这破坏了交通部的记录。 为了处理这种情况, 考虑一些更灵活的泛型类型很有用。 到现在为止我们看到的规 则限制比较大。

java泛型方法的写法

java泛型方法的写法

java泛型方法的写法一、泛型概述泛型是Java 5引入的一个新特性,它允许在类、接口和方法级别定义类型参数,从而提高了代码的可重用性和可维护性。

在Java泛型中,类型参数在编译期间会进行擦除,所以并不会给程序带来多余的开销。

二、泛型方法定义在Java中,泛型方法是指方法参数具有泛型性质的语法糖。

泛型方法的一般形式为:方法名称(类型参数标识符<类型参数列表>) 方法体例如,定义一个接受Integer类型的泛型方法,用于计算一组数字的总和:```javapublic static <T extends Number> int sum(List<T> list) { int sum = 0;for (T num : list) {sum += num.intValue();}return sum;}```在上述代码中,方法名称为"sum",类型参数标识符为"T",它表示该方法可以接受任何实现了Number接口的类型的参数。

类型参数列表为"T extends Number",表示类型参数T必须是Number或其子类的类型。

三、泛型方法使用使用泛型方法时,需要将要传递的具体类型作为参数传递给方法。

例如,可以使用上述定义的sum方法来计算一个整数列表的总和:```javaList<Integer> intList = Arrays.asList(1, 2, 3, 4, 5);int sum = sum(intList); // 输出:15```在上述代码中,将一个整数列表作为参数传递给sum方法,并将返回值存储在sum变量中。

最后,sum变量的值为15,即该列表中所有数字的总和。

四、泛型方法注意事项在使用泛型方法时,需要注意以下几点:1. 类型参数必须被限制在已定义的继承关系中。

例如,如果类型参数是Object或基本类型,则泛型将失去意义。

java 模板方法 泛型

java 模板方法 泛型

java 模板方法泛型摘要:1. Java 模板方法简介2.泛型概念与用途3.模板方法与泛型的结合应用4.实例演示5.总结与建议正文:【1.Java 模板方法简介】Java 模板方法是一种设计模式,它定义了一个算法的骨架,将一些步骤延迟到子类中实现。

模板方法模式允许子类在不改变算法结构的情况下重定义该算法的某些特定步骤。

这种模式使得子类可以灵活地扩展父类的功能,同时保持代码的复用性和可维护性。

【2.泛型概念与用途】泛型是Java 语言中一种重要的特性,它允许程序员在编译时检查代码的类型安全性。

泛型可以有效地避免运行时的类型转换错误,提高代码的可靠性和可重用性。

泛型主要用于创建与特定类型无关的代码,例如创建通用算法、数据结构和容器等。

【3.模板方法与泛型的结合应用】模板方法与泛型的结合可以使我们更好地构建可扩展且类型安全的代码。

以ArrayList 为例,它采用了模板方法设计模式,并使用了泛型。

ArrayList类定义了一个通用的方法add,用于向容器中添加元素。

在这个方法中,使用了泛型参数T 表示添加的元素类型。

子类可以根据需要实现具体的添加操作,如IntegerArrayList、StringArrayList 等。

【4.实例演示】以下是一个简单的模板方法与泛型结合的示例:```javaabstract class Animal {abstract void sound();void move() {System.out.println("动物在移动");}}class Dog extends Animal {void sound() {System.out.println("狗叫声:汪汪");}}class Cat extends Animal {void sound() {System.out.println("猫叫声:喵喵");}}public class Main {public static void main(String[] args) {Animal animal = new Animal();animal.move();Dog dog = new Dog();dog.sound();Cat cat = new Cat();cat.sound();}}```【5.总结与建议】模板方法与泛型结合是一种非常实用的编程技巧,可以帮助我们构建更加灵活、可扩展和类型安全的代码。

java 泛型用法实例

java 泛型用法实例

java 泛型用法实例Java 泛型是一种将类型参数化的方法,通过它可以在编译时检测到类型不匹配的错误。

泛型的核心思想是参数化类型,实现了代码的重用性和类型的安全性。

下面我将通过一些实例来介绍 Java 泛型的用法。

1. 泛型类泛型类是指在定义类时使用类型参数来代替真实类型。

例如,我们可以定义如下的一个泛型类来表示一个有序对(Ordered Pair):```public class OrderedPair<K, V> {private K key;private V value;public OrderedPair(K key, V value) {this.key = key;this.value = value;}public K getKey() {return key;}public V getValue() {return value;}}```在上面的例子中,`K` 和 `V` 是类型参数,用来代替真实的类型。

在使用该类时,我们可以指定实际的类型来创建对象:```OrderedPair<Integer, String> p1 = new OrderedPair<Integer, String>(1, "One");OrderedPair<String, Integer> p2 = new OrderedPair<String, Integer>("Two", 2);```2. 泛型方法泛型方法是指在定义方法时使用类型参数来代替方法中的参数类型。

例如,我们可以定义如下的一个泛型方法来交换数组中的两个元素:```public static <T> void swap(T[] array, int i, int j) {T temp = array[i];array[i] = array[j];array[j] = temp;}```在上面的例子中,`<T>` 表示该方法是一个泛型方法,类型参数 `T` 用来代替真实的类型。

java泛型原理

java泛型原理

java泛型原理Java泛型是在JDK 5引入的新特性,它的原理是通过类型参数化来实现程序的通用性和安全性。

泛型的使用可以将类型的确定延迟到编译时,从而减少类型转换的错误。

下面是Java泛型的一些原理解释。

1. 类型参数化泛型的关键概念就是类型参数化,通过在类名后面添加尖括号和类型参数,使类中的字段、方法或者参数具有通用性。

例如,在List接口中定义了一个泛型方法,可以使用不同类型的元素进行参数化。

2. 类型擦除虽然Java在编译时会对泛型进行类型检查,但在运行时会擦除泛型的具体类型信息。

换句话说,泛型在编译时是一个安全的类型检查机制,但在运行时是一个未知的类型。

这是由于Java的泛型是通过类型擦除来实现的。

3. 类型擦除后的替代当泛型被类型擦除之后,会使用类型变量的上限或者Object类型来替代相应的参数类型。

例如,List<String>会被擦除为List<Object>,而List<T extends Comparable>会被擦除为List<Comparable>。

4. 泛型边界在泛型中,可以通过使用通配符和类型边界来限制类型参数的范围。

边界可以是类、接口或者类型变量。

例如,下面的泛型方法会使用Comparable接口来限制类型参数T的范围。

```javapublic <T extends Comparable<T>> int compare(T a, T b) {return pareTo(b);}```5. 泛型的通配符通配符是一种特殊的类型用法,用于在某些情况下不关心具体类型的情况下使用。

通配符使用`?`来表示,可以用于声明变量、方法参数或者返回类型。

例如,使用通配符声明一个List:```javaList<?> list = new ArrayList<>();```以上就是Java泛型的一些原理解释,通过对类型参数化和类型擦除的理解,我们可以更好地使用泛型来提高程序的通用性和安全性。

java范型方法

java范型方法

java范型方法在 Java 中,范型是一种强大的特性,允许开发者在编写代码时定义一种通用的类型,以实现代码的重用性和类型安全性。

范型方法是在方法级别上使用范型的一种方式,可以使方法适用于多种类型的参数,而不必为每种类型编写多个重载方法。

范型方法可以在任何返回类型不同的方法中实现代码的重用。

范型方法的定义和使用方式如下:```javapublic <T> void methodName(T parameter)//方法的实现```在上述代码中,`<T>` 表示这是一个范型方法,并且 `T` 是一个类型参数。

在方法名前的 `<T>` 表示这个方法的返回类型是一个范型类型。

`methodName` 是方法的名称,`parameter` 是方法的参数。

使用范型方法可以实现对不同类型参数的支持,例如下面的例子:```javapublic class GenericMethodExamplepublic <T> void printArray(T[] array)for (T item : array)System.out.println(item);}}public static void main(String[] args)Integer[] intArray = { 1, 2, 3, 4, 5 };String[] stringArray = { "Java", "is", "awesome" };GenericMethodExample example = new GenericMethodExample(;example.printArray(intArray);example.printArray(stringArray);}```在上述代码中,`printArray` 是一个范型方法,可以接受任何类型的数组作为参数,并打印出数组中的每个元素。

java 1.5中for循环的新写法

java 1.5中for循环的新写法

java 1.5中for循环的新写法收藏J2SE 1.5新特性之增强For循环J2SE 1.5提供了另一种形式的for循环。

借助这种形式的for循环,可以用更简单地方式来遍历数组和Collection等类型的对象。

本文介绍使用这种循环的具体方式,说明如何自行定义能被这样遍历的类,并解释和这一机制的一些常见问题。

在Java程序中,要“逐一处理”——或者说,“遍历”——某一个数组或Collection中的元素的时候,一般会使用一个for循环来实现(当然,用其它种类的循环也不是不可以,只是不知道是因为for这个词的长度比较短,还是因为for这个词的含义和这种操作比较配,在这种时候for循环比其它循环常用得多)。

对于遍历数组,这个循环一般是采取这样的写法:清单1:遍历数组的传统方式/* 建立一个数组*/int[] integers = {1, 2, 3, 4};/* 开始遍历*/for (int j = 0; j < integers.length; j++) {int i = integers[j];System.out.println(i);}而对于遍历Collection对象,这个循环则通常是采用这样的形式:清单2:遍历Collection对象的传统方式/* 建立一个Collection */String[] strings = {"A", "B", "C", "D"};Collection stringList = java.util.Arrays.asList(strings);/* 开始遍历*/for (Iterator itr = stringList.iterator(); itr.hasNext();) {Object str = itr.next();System.out.println(str);}而在Java语言的最新版本——J2SE 1.5中,引入了另一种形式的for循环。

整理最全的Java笔试题库之问答题篇-国企笔试题库

整理最全的Java笔试题库之问答题篇-国企笔试题库

整理最全的Java笔试题库之问答题篇|国企笔试题库最全的Java笔试题库之问答题篇问题:最全的Java笔试题库之问答题篇-总共243道【1~60】回答: 1. J2EE是什么?它包括哪些技术?解答:从整体上讲,J2EE是使用Java技术开发企业级应用的工业标准,它是Java技术不断适应和促进企业级应用过程中的产物。

适用于企业级应用的J2EE,提供一个平台独立的、可移植的、多用户的、安全的和基于标准的企业级平台,从而简化企业应用的开发、管理和部署。

J2EE是一个标准,而不是一个现成的产品。

主要包括以下这些技术: 1) Servlet Servlet是Java平台上的CGI技术。

Servlet在服务器端运行,动态地生成Web页面。

与传统的CGI和许多其它类似CGI的技术相比,Java Servlet具有更高的效率并更容易使用。

对于Servlet,重复的请求不会导致同一程序的多次转载,它是依靠线程的方式来支持并发访问的。

2)JSP JSP(Java Server Page)是一种实现普通静态HTML和动态页面输出混合编码的技术。

从这一点来看,非常类似Microsoft ASP、PHP等技术。

借助形式上的内容和外观表现的分离,Web页面制作的任务可以比较方便地划分给页面设计人员和程序员,并方便地通过JSP来合成。

在运行时态,JSP将会被首先转换成Servlet,并以Servlet的形态编译运行,因此它的效率和功能与Servlet相比没有差别,一样具有很高的效率。

3) EJB EJB 定义了一组可重用的组件:Enterprise Beans。

开发人员可以利用这些组件,像搭积木一样建立分布式应用。

4)JDBC JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language,结构化查询语言)数据库访问接口,它使数据库开发人员能够用标准Java API编写数据库应用程序。

JDK1.5 JDK1.6 各自的新特性

JDK1.5 JDK1.6 各自的新特性

JDK1.5(JDK5.0)Java2标准版(Java 2 Platform, Standard Edition, J2SE)1.5版本更新不同于以往,它带来了很多里程碑式的革新,SUN将其绰号取名为“虎”。

这一次的变革将是Java诞生以来从未有过的,它给我们带来了耳目一新的感觉。

下面我们就来欣赏一下其中的部分典型变化:比较JDK版本,JDK 1.5中新增的语言特性:1.枚举(增加了一个关键字enum);2.变参(方法参数数量可以不固定多少);3.泛型;4.自动拆装箱(基本类型与包装类型可以混用);5.foreach循环(方法地用于遍历数组和集合);6.静态导入(可以在使用静方法前不加类名);7.注释(采用@前缀,这个基本上是为了简化J2EE而准备的,在JavaEE5中的EJB3、JPA 等中随处可以看到它的身影)。

在JVM、基本类库、SDK工具和硬件平台支持上都有很多的提高,这个JDK版本的出现可以说是Java中的一次飞越。

具体的解释下:1.自动包装和解包(Autoboxing and unboxing)代码示例往一个ArrayList中加入一个整数,1.5版本以前的版本写法是:List list = new ArrayList();list.add( new Integer( 10 ) );而在1.5版本中可以写为:list.add( 10 );因为,在1.5版本中,对一个整数进行包装,使之成为一个Integer对象(即包装,boxing),然后加入到一个ArrayList中的做法被认为是没有必要的,反之,解包(unboxing)的做法也是没有必要的,这样的代码只是增加了程序的文本长度而已,所以1.5版本支持了自动包装和解包操作,对于bool/Boolean,byte/Byte,double/Double,short/Short,int/Integer,long/Long,float/Float的相应包装/解包操作都进行了支持,从而使代码变得简单。

java 泛型方法

java 泛型方法

java 泛型方法Java的泛型方法是指将类型参数应用于方法声明中的类型参数,将其作为定义方法的一部分来使用。

泛型方法允许程序员在不更改原有方法行为的情况下,可以使用不同的类型参数,以实现不同的类型操作,从而最大限度地提高程序的复用性。

这篇文章将主要介绍Java 的泛型方法的历史、优点以及使用的实现方法。

Java泛型方法的历史Java泛型方法的历史可以追溯到20世纪90年代,当时有一个叫做Genericity的程序设计范例,它使用统一类定义方法,以在一个类中实现不同的数据类型。

它使用一个共同的类模板:在实现不同类型的类时,只需要在定义中插入一个表示类型的变量即可。

这种技术叫做参数化类型,它就是Java泛型方法的前身。

在2004年,Java 1.5版本正式对Java泛型方法进行支持,从而为程序员提供了更加灵活的设计思路,以达到编程的更高效率。

Java泛型方法的优点Java的泛型方法以参数化类型的形式支持多种数据类型,只需要在定义中插入一个表示类型的变量即可,这样使得程序员可以将所有不同数据类型的操作都集中在一个方法中实现,而无需为各个类型分别编写方法,从而提高了程序的复用性。

此外,使用Java泛型方法,程序员可以更加方便地实现跨类型操作,例如,可以利用泛型方法实现将字符、数字和布尔值转换为指定的类型,从而实现一个函数的功能。

Java的泛型方法的使用Java的泛型方法是通过引入类型参数的方式来使用的,将类型参数作为方法声明中的一部分,来实现对不同数据类型的操作。

举例来说,我们可以在定义一个方法时定义一个类型参数:public static void examples(T t){}这里的T就表示任意类型,方法中可以根据传入的参数来判断操作的具体类型。

值得注意的是,在使用Java的泛型方法时,为了避免和其他泛型类混淆,可以使用前缀约定的方式,将类型参数以指定的字母开头,例如T,V等。

总结Java的泛型方法以参数化类型的形式,使得程序员可以在不更改原有方法行为的情况下,可以使用不同的类型参数,以实现不同的类型操作,从而有效地提高程序的复用性。

java 范型方法

java 范型方法

java 范型方法Java 范型方法1. 什么是范型方法?范型方法是指可以处理多种不同的数据类型的通用方法。

它使用范型参数来确定处理的数据类型,从而使得该方法可以在运行期间处理多种不同类型的数据。

该概念可以为开发人员提供更高级别和灵活性的编程体验,使得程序中可以使用更少的代码实现更多的目的。

2. 为什么要使用范型方法?范型方法的优点有:(1)灵活性。

可以处理多种不同的数据类型,使得程序更加灵活。

(2)提高可复用性。

范型方法支持多种类型的数据,从而可以多次使用它来输入不同类型的数据,提高了代码的复用性。

(3)安全性。

范型方法支持多种不同类型的数据,在编译期间及运行期间都会对数据类型进行一些安全检查,从而大大降低数据的风险。

(4)简洁性。

使用范型方法可以减少很多代码,而且操作还更加方便快捷。

3. 范型方法的基本语法范型方法的基本语法如下:<返回值类型> 方法名字(范型类型 <参数1>,范型类型<参数2> ...){语句块}其中,范型类型是一种根据需要在定义方法时定义的通用类型,参数1、参数2等表示范型参数,也就是方法中支持的输入参数。

4. 示例以下是一个简单的范型方法示例:public <T> void printNumber(T input) {System.out.println(input);}此方法的输入参数是可以根据需要指定的范型类型,其中T就是范型参数,可以根据需要用不同的类型来传入参数,比如Integer、Double 等。

可以这样调用:printNumber(5);printNumber(4.5);最后,Java范型方法为开发提供了更能满足复杂开发需求的强大工具,不仅可以提供灵活性和安全性,而且对于复杂功能的实现也更为简洁和便捷。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java1.5泛型指南中文版(Java1.5 Generic Tutorial)目录摘要和关键字generics、type safe、type parameter(variable)、formal type parameter、actual type parameter、wildcards(?)、unknown type、? extends T、? super T、erasure、translation、cast、instanceof、arrays、Class Literals as Run-time Type Tokens、wildcard capture、multiple bounds(T extends T1& T2 ... & Tn)、covariant returns1.介绍JDK1.5中引入了对java语言的多种扩展,泛型(generics)即其中之一。

这个教程的目标是向您介绍java的泛型(generic)。

你可能熟悉其他语言的泛型,最著名的是C++的模板(templates)。

如果这样,你很快就会看到两者的相似之处和重要差异。

如果你不熟悉相似的语法结构,那么更好,你可以从头开始而不需要忘记误解。

Generics允许对类型进行抽象(abstract over types)。

最常见的例子是集合类型(Container types),Collection的类树中任意一个即是。

下面是那种典型用法:List myIntList = new LinkedList();// 1myIntList.add(new Integer(0));// 2Integer x = (Integer) myIntList.iterator().next();// 3第3行的类型转换有些烦人。

通常情况下,程序员知道一个特定的list里边放的是什么类型的数据。

但是,这个类型转换是必须的(essential)。

编译器只能保证iterator返回的是Object 类型。

为了保证对Integer类型变量赋值的类型安全,必须进行类型转换。

当然,这个类型转换不仅仅带来了混乱,它还可能产生一个运行时错误(run time error),因为程序员可能会犯错。

程序员如何才能明确表示他们的意图,把一个list中的内容限制为一个特定的数据类型呢?这是generics背后的核心思想。

这是上面程序片断的一个泛型版本:List<Integer> myIntList = new LinkedList<Integer>(); // 1myIntList.add(new Integer(0)); // 2Integer x = myIntList.iterator().next(); // 3注意变量myIntList的类型声明。

它指定这不是一个任意的List,而是一个Integer的List,写作:List<Integer>。

我们说List是一个带一个类型参数的泛型接口(a generic interface that takes a type parameter),本例中,类型参数是Integer。

我们在创建这个List对象的时候也指定了一个类型参数。

另一个需要注意的是第3行没了类型转换。

现在,你可能认为我们已经成功地去掉了程序里的混乱。

我们用第1行的类型参数取代了第3行的类型转换。

然而,这里还有个很大的不同。

编译器现在能够在编译时检查程序的正确性。

当我们说myIntList被声明为List<Integer>类型,这告诉我们无论何时何地使用myIntList 变量,编译器保证其中的元素的正确的类型。

与之相反,一个类型转换说明程序员认为在那个代码点上它应该是那种类型。

实际结果是,这可以增加可读性和稳定性(robustness),尤其在大型的程序中。

2.定义简单的泛型下面是从java.util包中的List接口和Iterator接口的定义中摘录的片断:public interface List<E>{void add(E x);Iterator<E> iterator();}public interface Iterator<E>{E next();boolean hasNext();}这些都应该是很熟悉的,除了尖括号中的部分,那是接口List和Iterator中的形式类型参数的声明(the declarations of the formal type parameters of the interfaces List and Iterator)。

类型参数在整个类的声明中可用,几乎是所有可是使用其他普通类型的地方(但是有些重要的限制,请参考第7部分)。

(原文:Type parameters can be used throughout the generic declaration, pretty much where you would use ordinary types (though there are some important restrictions; see section 7))在介绍那一节我们看到了对泛型类型声明List(the generic type declaration List)的调用,如List<Integer>。

在这个调用中(通常称作一个参数化类型a parameterized type),所有出现形式类型参数(formal type parameter,这里是E)都被替换成实体类型参数(actual type argument)(这里是Integer)。

你可能想象,List<Integer>代表一个E被全部替换成Integer 的版本:public interface IntegerList{void add(Integer x)Iterator<Integer> iterator();}这种直觉可能有帮助,但是也可能导致误解。

它有帮助,因为List<Integer>的声明确实有类似这种替换的方法。

它可能导致误解,因为泛型声明绝不会实际的被这样替换。

没有代码的多个拷贝,源码中没有、二进制代码中也没有;磁盘中没有,内存中也没有。

如果你是一个C++程序员,你会理解这是和C++模板的很大的区别。

一个泛型类型的声明只被编译一次,并且得到一个class文件,就像普通的class或者interface的声明一样。

类型参数就跟在方法或构造函数中普通的参数一样。

就像一个方法有形式参数(formal value parameters)来描述它操作的参数的种类一样,一个泛型声明也有形式类型参数(formal type parameters)。

当一个方法被调用,实参(actual arguments)替换形参,方法体被执行。

当一个泛型声明被调用,实际类型参数(actual type arguments)取代形式类型参数。

一个命名的习惯:我们推荐你用简练的名字作为形式类型参数的名字(如果可能,单个字符)。

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

许多容器类型使用E 作为其中元素的类型,就像上面举的例子。

在后面的例子中还会有一些其他的命名习惯。

3.泛型和子类继承让我们测试一下我们对泛型的理解。

下面的代码片断合法么?List<String> ls = new ArrayList<String>(); //1List<Object> lo = ls; //2第1行当然合法,但是这个问题的狡猾之处在于第2行。

这产生一个问题:一个String的List是一个Object的List么?大多数人的直觉是回答:“当然!”。

好,在看下面的几行:lo.add(new Object()); // 3String s = ls.get(0); // 4: 试图把Object赋值给String这里,我们使用lo指向ls。

我们通过lo来访问ls,一个String的list。

我们可以插入任意对象进去。

结果是ls中保存的不再是String。

当我们试图从中取出元素的时候,会得到意外的结果。

java编译器当然会阻止这种情况的发生。

第2行会导致一个编译错误。

总之,如果Foo是Bar的一个子类型(子类或者子接口),而G是某种泛型声明,那么G<Foo>是G<Bar>的子类型并不成立!! 这可能是你学习泛型中最难理解的部分,因为它和你的直觉相反。

这种直觉的问题在于它假定这个集合不改变。

我们的直觉认为这些东西都不可改变。

举例来说,如果一个交通部(DMV)提供一个驾驶员里表给人口普查局,这似乎很合理。

我们想,一个List<Driver>是一个List<Person>,假定Driver是Person的子类型。

实际上,我们传递的是一个驾驶员注册的拷贝。

然而,人口普查局可能往驾驶员list中加入其他人,这破坏了交通部的记录。

为了处理这种情况,考虑一些更灵活的泛型类型很有用。

到现在为止我们看到的规则限制比较大。

4.通配符(Wildcards)考虑写一个例程来打印一个集合(Collection)中的所有元素。

下面是在老的语言中你可能写的代码:void printCollection(Collection c) {Iterator i = c.iterator();for (int k = 0; k < c.size(); k++) {System.out.println(i.next());}}下面是一个使用泛型的幼稚的尝试(使用了新的循环语法):void printCollection(Collection<Object> c) {for (Object e : c) {System.out.println(e);}}问题是新版本的用处比老版本小多了。

老版本的代码可以使用任何类型的collection作为参数,而新版本则只能使用Collection<Object>,我们刚才阐述了,它不是所有类型的collections的父类。

那么什么是各种collections的父类呢?它写作:Collection<?>(发音为:"collection of unknown"),就是,一个集合,它的元素类型可以匹配任何类型。

显然,它被称为通配符。

我们可以写:void printCollection(Collection<?> c) {for (Object e : c) {System.out.println(e);}}现在,我们可以使用任何类型的collection来调用它。

相关文档
最新文档