(转)JDK1.5新特性 (1) - 泛型

2008-04-24 – 8:56 pm

1. 泛型

1.1 泛型的概念

所谓泛型是指类型参数化(parameterized types)

Java是一种强类型的语言, J2SE 1.4以及以前的版本中, 我们在定义一个Java, 接口或者方法的时候, 必须指定变量的类型。

在声明泛型类、接口或者函数时, 定义变量的时候不指定某些变量的具体类型, 而是用一个类型参数代替。 在使用这个类、 接口、 或者方法的时候, 这个类型参数由一个具体类型所代替。

1.2      泛型的用法

1.2.1   泛型类

创建一个最简单泛型类

最简单的泛型类

 

public class GenSample<T> {}

类名后面带有<T>表明了这个类是泛型类, 其中T被称为类型参数(type parameter), 在使用泛型的时候, 类型参数可以被替换为任何的类类型, 但是不能是原始类型(primitive type), 例如int, double.

下面通过一个列表的例子来具体说明如何声明泛型类和类型参数的用法.

 

public class GenList <T>{

        private T[] elements;

        private int size = 0;

        private int length = 0;

 

        public GenList(int size) {

               elements = (T[])new Object[size];

               this.size = size;

        }

 

        public T get(int i) {

               if (i < length) {

                       return elements[i];

               }

               return null;

        }

       

        public void add(T e) {

               if (length < size - 1)

                       elements[length++] = e;

        }

}

 

1.2.2 泛型接口

声明泛型接口和声明泛型类的语法类似, 也是在接口命称后面加上<T>. 例如:

 

public interface GenInterface<T> {

    void func(T t);

}

在声明泛型类的时候, 可是使用多个类型参数. 多个类型参数之间用逗号分开, 例如:

 

public class GenMap<T, V> {}

 

1.2.2   泛型方法

声明泛型方法的一般格式是

 

<type-list> return-type method-name(parameter-list) {}

清单3.2.6 泛型方法示例

 

public <T> String getString(T obj) {

        return obj.toString();

}

1.2.3 特殊用法

受限泛型

受限泛型是指类型参数的取值范围是受到限制的. extends关键字不仅仅可以用来声明类的继承关系, 也可以用来声明类型参数(type parameter)的受限关系.例如, 我们只需要一个存放数字的列表, 包括整数(Long, Integer, Short), 实数(Double, Float), 不能用来存放其他类型, 例如字符串(String), 也就是说, 要把类型参数T的取值泛型限制在Number极其子类中.在这种情况下, 我们就可以使用extends关键字把类型参数(type parameter)限制为数字,

受限泛型示例:

 

public class Limited<T extends Number> {

        public static void main(String[] args) {

               Limited<Integer> number;   //正确

               Limited<String> str;       //编译错误

        }

}

 

使用通配符

前面我们创建了泛型的列表, 如果我需要一个方法来处理泛型列表, 例如, 我们希望把列表中的每个元素都打印出来, 但是类型参数(type parameter)只能使用在声明一个泛型类的时候, 如果类型参数使用在函数定义里会导致编译错误

 

 

public static void print(GenList<T> list){}   //编译错误

在这种情况下, 我们需要用另外一种方法来表示一个泛型类, 否则, 就可能需要书写多个print函数

 

 

 

public static void print(GenList<Integer> list){}

public static void print(GenList<Double> list){}

public static void print(GenList<String> list){}

J2SE 5.0中提供了泛型的通配符”?”, “?”可以用来代替任何类型, 例如使用通配符来实现print方法

 

public static void print(GenList<?> list) {}

 

1.3      特点

ü         类型安全限制

ü         不再需要强制转换类型

1.4      局限性

泛型的一些局限型
(1) 类型参数不能实例化, 例如,

 

T t= new T();   //编译错误

(2) 不能实例化类型参数的数组

 

T[] ts= new T[10];   //编译错误

(3) 类的静态变量不能声明为类型参数类型

 

public class GenClass<T> {

     private static T t;    //编译错误

}

 

(4) 泛型类不能继承自Throwable以及其子类

 

public GenExpection<T> extends Exception{}    //编译错误

 

Popularity: 7% [?]

Leave a Reply

You must be logged in to post a comment.