Java泛型
---------- android培训、java培训、期待与您交流!----------
1、泛型的概念
在JDK1.5之后,Java中出现了泛型的概念,主要是为了解决数据类型的安全问题。将运行时期的问题ClassCastException问题转换成了编译失败,体现在编译时期,程序员就可以解决问题。使用泛型的主要原理就是:在类的声明时通过一个标识表示类中某个属性的类型,或者是某个方法的返回值 类型及参数类型。这样在类声明或者实例化的时候只要制定好需要的类型即可。
2、泛型的使用
泛型用“<E>”来表示,其中的E并没有实际的意义,可以为任意的字母,E代表一个数据类型,并且这个类型是由外部定义的,当使用时“<E>”用来接收外部所定义的类型。在不使用泛型之前,当类中操作的引用数据类型不确定的时候,用Object来进行扩展,现在可以用泛型来表示,这样可以避免强转的麻烦,而且将运行问题转移到的编译时期。
(1) 泛型可以定义类
什么时候定义泛型类?当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展,现在来定义泛型来完成扩展,如:
class A{}
class B{}
class Utils
{
private T t;
public void setObject(T t){
this.t = t;
}
public T getObject(){
return t;
}
}
public class FanXing {
public static void main(String[] args) {
Utils
u = new Utils
();
u.setObject(new A());
A a = u.getObject();
}
}
(2) 泛型可以定义方法
为了让不同方法操作不同的数据类型,可以将泛型定义在方法上。
class Demo{
public
void show(T t){
System.out.println("show"+t);
}
public
void print(Q q){
System.out.println("print"+q);
}
}
public class FanXing {
public static void main(String[] args) {
Demo d = new Demo();
d.show("hello");
d.print(new Integer(10));
}
}
(3) 泛型可以同时定义在类与方法中
class Demo
{
public void show(T t){
System.out.println("show"+t);
}
public
void print(Q q){
System.out.println("print"+q);
}
}
public class FanXing {
public static void main(String[] args) {
Demo
d = new Demo
();
d.show("hello");
d.print(new Integer(10));
}
}
(4) 静态方法不可以访问定义在类上的泛型,可以将泛型定义在静态方法上,且<>要放在返回值类型前
(5) 泛型也可以定义在接口上
interface Inter
{
void show(T t);
}
class Demo
implements Inter
{
public void show(T t){
System.out.println("show"+t);
}
}
public class FanXing {
public static void main(String[] args) {
Demo
d = new Demo
(); d.show("hello"); } }
(6) 也可以对类指定多个泛型
import java.io.File;
import java.io.IOException;
class Demo
{
public void show(T t){
System.out.println("show"+t);
}
public void print(R r){
System.out.println("print"+r);
}
}
public class FanXing {
public static void main(String[] args) {
Demo
d = new Demo
();
d.show("hello");
d.print(new Integer(4));
}
}
3、通配符
在引用传递时,在泛型的操作中也可以设置一个泛型对象的范围上限及下限,即:泛型限定。
(1) 上限:使用“?extends E”可以接收E类型或者E的子类型对象,如下示例:
class Info
{ //定义Info类
private T t;
public T getT(){
return t;
}
public void setT(T t){
this.t = t;
}
}
public class FanXing{
public static void main(String[] args){
Info
i1 = new Info
();
Info
i2 = new Info
(); Info
i3 = new Info
(); i1.setT(30); i2.setT(23.1f); i3.setT("hello"); function(i1); function(i2); function(i3); //当传递String类型时会报错 } //该方法只能接收Number的子类型 public static void function(Info
i){ System.out.println(i.getT()); } }
(2 )下限:使用“?super E”可以接收E类型或者E的父类型对象。
上限什么时候用:往集合中添加元素时,既可以添加E类型对象,又可以添加E的子类型对象。为什么?因为取的时候,E类型既可以接收E类对象,又可以接收E的子类型对象。
下限什么时候用:当从集合中获取元素进行操作的时候,可以用当前元素的类型接收,也可以用当前元素的父类型接收。
---------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------