Java 泛型

来源:互联网 发布:苹果编程语言 编辑:程序博客网 时间:2024/06/05 12:43
1.1泛型的定义:

泛型可以解决数据类型的安全问题,它主要的原理是声明类的时候通过标示标示类中的某个属性的类型或者是某个方法的返回值及参数类型。这样在类声明或实例化的时候只要指定好需要的类型即可。

泛型类定义格式:

[访问权限] class 类名称<泛型类型1,泛型类型2,....泛型类型3>{

[访问权限] 泛型类型标示 变量名称

[访问权限] 泛型类型标示 方法名称(){};

[访问权限] 泛型类型标示 变量名称(泛型类型标示 变量名称){};}

泛型对象定义

类名称<具体类> 对象名称 = new 类名称<具体类>();

class 类<泛型类型>(

修饰符  泛型类型 属性;

public   泛型类型 getter(){}

public void setter(泛型类型 变量){}

);

}

package com.demo.text;class Point<T> { // 此处可以随便写标示符号,T是type的简称private T var; // var 类型由T指定,既由外部指定public T getVar() { // 返回值得类型由外部决定return var;}public void setVar(T var) { // 设置的类型也由外部决定this.var = var;}}public class Buffer {public static void main(String[] args) {Point<String> p = new Point<String>();  //里面的var类型为String类型p.setVar("Hello");  //设置字符串System.out.println(p.getVar().length());   //取得字符串的长度}}

以上是将var变量设置成了String类型,当然也可以设置成Integer,如果设置的内容与指定的泛型类型不一致,则在编译时出现错误。



1.2泛型在构造方法中的应用

package com.demo.text;class Point<T> { // 此处可以随便写标示符号,T是type的简称private T var; // var 类型由T指定,既由外部指定public Point (T var){  //通过构造方法设置内容this.var = var;}public T getVar() { // 返回值得类型由外部决定return var;}public void setVar(T var) { // 设置的类型也由外部决定this.var = var;}}public class Buffer {public static void main(String[] args) {Point<String> p = new Point<String>("Hello");  //里面的var类型为String类型System.out.println("内容:"+p.getVar());   //取得字符串的长度}}

输出结果

内容:Hello


1.3在泛型中也可以指定多个类型

package com.demo.text;class Notepad<k, v> {private k key;private v value;public k getKey() {return this.key;}public void setKey(k key) {this.key = key;}public v getValue() {return this.value;}public void setValue(v value) {this.value = value;}}public class GenericsNotepad {public static void main(String[] args) {Notepad<String, Integer> t = null; // 定义两个泛型类的对象t = new Notepad<String, Integer>(); // 里面的key为String类型,values为Integer类型t.setKey("德罗巴"); // 设置第一个内容t.setValue(33); // 设置第二个内容System.out.println("姓名:" + t.getKey()); // 取得姓名System.out.println("年龄:" + t.getValue()); // 取得年龄}}

输出结果:

姓名:德罗巴
年龄:33


1.4泛型的安全警告

在泛型应用中最好在类声明类对象的时候指定好其内部的数据类型,例如“Info<String>”,也可以不指定类型 。

package com.demo.text;class Info<T> {private T var;public T getVar() {return this.var;}public void setVar(T var) {this.var = var;}public String toString() { // 复写Object中的toString()方法return this.var.toString();}}public class GenericsNotepad {public static void main(String[] args) {Info i = new Info();   //警告,没有指定泛型类型i.setVar("哈哈");    //设置字符串System.out.println("内容:"+i.getVar());}}
编译以上程序会报出使用了未经检查或不安全的操作,请重新编译。

程序不会影响执行,但是此时,在Info类中并没有指定泛型的类型,则在java中为了保证程序依然可以使用,会将T设置成Object类型,这样一来,就可以接受任意的数据类型 也就是说var的类型就是Object,所有的泛型信息将被檫除。


输出结果:内容:哈哈

1.5泛型接口

之前的所有操作都是在类中直接使用泛型的,那么对于java来说,也可以直接在接口中定义和使用泛型。

在JDK1.5之后,不仅仅可以声明泛型类,也可以声明泛型接口,声明泛型接口和声明泛型类的语法类似,也是在接口后面加上<T>,格式如下。

[访问权限] interface 接口名称<泛型标识>{}

interface Info<T>{                                   //在接口中定义泛型

public T getVar();                                   //定义抽象方法,抽象方法的返回值就是泛型类型

}

如果现在一个子类实现此接口但是没有正确的实现,则在编译时候出现警告信息。

1.6泛型接口声明的方式

定义子类,在子类上声明泛型类型

package com.demo.text;interface Info<T> { // 在接口中定义泛型public T getVar(); // 定义抽象方法,抽象方法的返回值 就是泛型类型}class InfoImpl<T> implements Info<T> { // 定义泛型接口的子类private T var; // 定义属性public InfoImpl(T var) { // 通过构造方法设置属性内容this.setVar(var);}public void setVar(T var) {this.var = var;}public T getVar() {return this.var;}}public class GenericsNotepad{public static void main(String[] args) {Info<String>i = new InfoImpl<String>("德罗巴");  //实例化对象System.out.println("内容:"+i.getVar());}}
1.7泛型方法

之前的所有的泛型除了可以在类中的属性指定类型外,也可以定义方法,泛型方法所在的类中是否是泛型类没有任何关系。

定义泛型方法的语法

[访问权限]<泛型标识>泛型标识   方法名称([泛型标识 参数名称])

package com.demo.text;class Demo1{public <T> T fun(T t){// 可以接收任意类型的数据return t ;// 直接把参数返回}};public class GenericsNotepad{public static void main(String args[]){Demo1 d = new Demo1();// 实例化Demo对象String str = d.fun("德罗巴") ; //传递字符串int i = d.fun(30) ;// 传递数字,自动装箱System.out.println(str) ;// 输出内容System.out.println(i) ;// 输出内容} };