Java泛型的基本应用

一、泛型概述

  jdk1.5版本以后出现的新特性,用于解决安全问题,是一个安全机制。

  好处:

  1,将运行时期的问题ClassCastException转到了编译时期。

  2,避免了强制转换的麻烦。

  什么时候用:

  当操作的引用数据类型不确定的时候。就使用泛型(<>)。将要操作的引用数据类型传入即可,其实<>就是一个用于接收具体引用数据类型的参数范围。

  在程序中,只要用到了带有<>的类或者接口,就要明确传入的具体引用数据类型。

  泛型技术是给编译器使用的技术,用于编译时期。确保了类型的安全。

  运行时,会将泛型去掉,生成的class文件中是不带泛型的,这个称为泛型的擦除。

  泛型的通配符:未知类型。

  二、泛型的使用


import java.util.*;

publicclass GenericDefineDemo4

{

publicstaticvoid main(String[] args)

{

ArrayList<String> arr=new ArrayList<String>();

arr.add("java01");

arr.add("java02");

arr.add("java03");

arr.add("java04");

Iterator<String> it=arr.iterator();

while(it.hasNext())

{

System.out.println(it.next());

}

}

}

 三、泛型类

  1、格式

  class ClassName<datatype>

  {

  }

  2、优点

  便于对任何未知的的数据类型进行操作,特别适合用作工具类,避免了强制类型转换的麻烦。

  3.示例


import java.util.*;

publicclass GenericClass

{

publicstaticvoid main(String[] args)

{

Tools<String> tools=new Tools<String>("hello");

System.out.println(tools.getObj());

}

}

class Tools<T>

{

private T obj;

public Tools(T t)

{

this.obj=t;

}

public T getObj() {

returnobj;

}

publicvoid setObj(T obj) {

this.obj = obj;

}

}

  四、泛型方法

  当只需要某一个方法可以接收不同类型的参数,而不是整个类的时候,就可以用到泛型方法,它将大大提高程序代码的扩展性。

  示例代码如下:


import java.util.*;

publicclass GenericMethod

{

publicstaticvoid main(String[] args)

{

String s="hello!Nice to meet you!";

Integer inter=3;

Show show=new Show();

show.print(s);

show.print(inter);

}

}

class  Show

{

public  <Q> void print(Q q)

{

System.out.println(q);

}

}

  五、静态泛型方法

  1、格式

  public static <T> methodName(T param)

  {

  }

  2、特点

  由于静态方法不可以访问类中的泛型,如果静态方法操作的类型不确定,这可以把泛型定义在静态方法上。

  3、示例

  publicstatic <Q> void print(Q q)

  {

  System.out.println(q);

  }

  六、泛型接口

  1、格式

  interface Inter<T>

  {

  void show(T t);

  }

  2、特点

  当接口要操作的数据类型不确定的时候,就可以使用泛型接口。

  注意:

  当实现接口的类已经确定了接口具体的类型时,创建对象时就不用再指明类型了,如:

  class InterImpl implements Inter<String>

  {

  }

  如果实现类仍不知道具体的类型,就要创建对象时指明,如:

  class InterImpl<T> implements Inter<T>

  {

  }

  InterImpl<String> im=new InterImpl<String>();

  3、示例


import java.util.*;

public class Test

{

public static void main(String[] args)

{

InterImpl<String> im=new InterImpl<String>();

im.print("hello");

}

}

interface Inter<T>

{

void print(T t);

}

class InterImpl<T> implements Inter<T>

{

public void print(T s)

{

System.out.println(s);

}

}

  七、泛型extends限定

  extends E:接收E类型或者E的子类型对象。上限

  一般存储对象的时候用。比如添加元素 addAll.

  八、泛型super限定

  super E:接收E类型或者E的父类型对象。下限。

  一般取出对象的时候用。比如比较器。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-30 03:05:38

Java泛型的基本应用的相关文章

java泛型type体系整理

一直对jdk的ref使用比较模糊,早上花了点时间简单的整理了下,也帮助自己理解一下泛型的一些处理.   java中class,method,field的继承体系     java中所有对象的类型定义类Type   说明:    Type :  Type is the common superinterface for all types in the Java programming language. These include raw types, parameterized types, 

Eclipse V3.1中的Java泛型支持

Java 中的泛型 几乎从第一个版本开始,Java 技术的创立者们就已经开始讨论对该语言添加 泛型支持.C++ 通过标准模板库对泛型进行支持,但是由于缺少所有其他类(嵌 入在 Java 语言中的Object 类中)的一个统一父类,泛型的实现也受到阻碍.Java编程语言的泛型支持是其历史上最重大的语法变化.由于某些显而易见的原因,工具支持比其他 SDK 升级的步法要慢得多.尽管如此,现在 Eclipse V3.1 已经对这些语言的新特性有了出色的支持.本文重点介绍其中的一些新特 性. Java 5

通过Java泛型实现数组排序和搜索的通用方法

下面讨论的是数组的排序和搜索功能,而一个通用方法则是实现Comparable接口的方法,这个方法需要通过java泛型来实现.下面便逐步讲解为何,以及如何通过Java泛型实现此类的通用方法. 如何在java类中一些通用方法,特别是一些静态的工具方法? 比如,数组Arrays的sort.search等? 1. 整数数组的顺序收缩 public static int seqSearch(int[] arr, int first, int last, int target) { for (int i =

java泛型异常,如何解决

问题描述 java泛型异常,如何解决 public static > AnyType[] mergesort(AnyType[] a,AnyType[] b) { int i=0; int j=0; int index=0; AnyType[] tmp=(AnyType[]) new Comparable[a.length+b.length]; while(i<a.length&&j<b.length){ if(a[i].compareTo(b[j])<0) { t

java泛型-Java泛型上下限super和extendS的使用区别,谢谢

问题描述 Java泛型上下限super和extendS的使用区别,谢谢 class DemoF{ public static void printA(Collection<?super Cat> c){ 相同的方法体,例如打印集合} public static void printB(Collection<?extend Animal> c){相同的方法体,例如打印集合} public static void main(String[ ] args){ Collection<

java参数-java泛型当中String 和Object之间是什么关系

问题描述 java泛型当中String 和Object之间是什么关系 Map里面的参数可以反过来写吗 写成Map 解决方案 挺不错嘛,元旦还怎么刻苦,当然是可以的,你想要明白Map值怎么用的,反过来写意思就不一样了. Map<String,Object> 表示 name是String 类型,Object是value的类型 Map<Object,String> 表示 name是Object 类型,String是value的类型 你可以参考这个:http://blog.csdn.net

问一个Java泛型与类继承的问题

问题描述 问一个Java泛型与类继承的问题 直接上代码了 //DeviceRepository类 public abstract class DeviceRepository<T extends Device> extends DomainRepository<T> //DeviceEventHandler类第一种写法 public abstract class DeviceEventHandler<M extends Device,R extends DeviceRepos

java 泛型-关于Java泛型推断,希望大牛不吝赐教

问题描述 关于Java泛型推断,希望大牛不吝赐教 请教大牛一个问题,希望不吝赐教,关于泛型的推断:当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时这多处的实际应用类型对应到了不同的类型,且没有使用返回值,这时候取多个参数中的最大交集类型 例:下面语句实际对应的类型就是Number了,编译没问题,只是运行时出问题. public static void test(T[] array, T b) { for (int i = 0; i < array.length;

Java泛型原理笔记

<T> T 到底是什么东东 Java泛型的语法相当的别扭,看到一个这样的写法,感觉到很神奇,正好研究下Java泛型是怎么实现的. public class A{ public static void main(String[] args) { A a = new A(); a.test(); String r = a.test(); } public <T> T test() { return (T) new Object(); } } 刚开始时,我看到那个"<T&

关于java泛型问题,为什么把extends改为super就不会出错

问题描述 关于java泛型问题,为什么把extends改为super就不会出错 class Employee{ } class Manager extends Employee{ }class CEO extends Manager{ }public class Test{ public static void main(String[] args) { List<? super Manager> list=new ArrayList();//编译不会出错 //List<? extend