Java泛型定义与用法入门示例

本文实例讲述了Java泛型定义与用法。分享给大家供大家参考,具体如下:

一 引入泛型背景

Java集合不会知道它们需要用它来保存什么类型的对象,所以他们把集合设计成能保存任何类型的对象,只要求具有很好的通用性。但这样做也带来两个问题:

  • 集合对元素类型没有任何限制,这样可能引发一些问题:例如想创建一个只能保存Dog对象的集合,但程序也可以轻易地将Cat对象“丢”进去,所以可能引发异常。
  • 由于把对象“丢进”集合时,集合丢失了对象的状态信息,集合只知道它盛装的是Object,因此取出集合元素后通常还需要进行强制类型转换。这种强制类型转换既会增加编程的复杂度、也可能引发ClassCastException。

二 不引入泛型的问题——编译时不检查类型的异常

1 代码

import java.util.*;
public class ListErr
{
  public static void main(String[] args)
  {
   // 创建一个只想保存字符串的List集合
   List strList = new ArrayList();
   strList.add("疯狂Java讲义");
   strList.add("疯狂Android讲义");
   // "不小心"把一个Integer对象"丢进"了集合
   strList.add(5);   // A处
   strList.forEach(str -> System.out.println(((String)str).length())); // B处
  }
}

2 运行

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
8
    at ListErr.lambda$main$0(ListErr.java:14)
11
    at java.util.ArrayList.forEach(ArrayList.java:1257)
    at ListErr.main(ListErr.java:14)

3 说明

程序在A处不小心把一个Integer对象“丢进”了List集合,这将导致程序在B处引发ClassCastException异常,因为程序试图把一个Integer对象转换为String类型。

三 引入泛型实战

1 代码

import java.util.*;
public class GenericList
{
  public static void main(String[] args)
  {
   // 创建一个只想保存字符串的List集合
   List<String> strList = new ArrayList<String>(); // ①
   strList.add("疯狂Java讲义");
   strList.add("疯狂Android讲义");
   // 下面代码将引起编译错误
   //strList.add(5);  // ②
   strList.forEach(str -> System.out.println(str.length())); // ③
  }
}

2 运行

8
11

3 说明

在集合中使用泛型后带来如下优势:

  • 程序再也不能“不小心”把其他对象“丢进”strList集合中,编译器会提示编译告警;
  • 程序更加简洁,集合自动记住所有集合元素的数据类型,从而无需对集合元素进行强制类型转换。

四 Java 7 泛型的菱形语法实战

1 代码

import java.util.*;
public class DiamondTest
{
  public static void main(String[] args)
  {
   // Java自动推断出ArrayList的<>里应该是String
   List<String> books = new ArrayList<>();
   books.add("疯狂Java讲义");
   books.add("疯狂Android讲义");
   // 遍历books集合,集合元素就是String类型
   books.forEach(ele -> System.out.println(ele.length()));
   // Java自动推断出HashMap的<>里应该是String , List<String>
   Map<String , List<String>> schoolsInfo = new HashMap<>();
   // Java自动推断出ArrayList的<>里应该是String
   List<String> schools = new ArrayList<>();
   schools.add("斜月三星洞");
   schools.add("西天取经路");
   schoolsInfo.put("孙悟空" , schools);
   // 遍历Map时,Map的key是String类型,value是List<String>类型
   schoolsInfo.forEach((key , value) -> System.out.println(key + "-->" + value));
  }
}

2 运行

8
11
孙悟空-->[斜月三星洞, 西天取经路]

3 说明

菱形语法对原有的泛型并没有改变,只是更好地简化了泛型编程。

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • Java中的泛型详解

    所谓泛型:就是允许在定义类.接口指定类型形参,这个类型形参在将在声明变量.创建对象时确定(即传入实际的类型参数,也可称为类型实参) 泛型类或接口 "菱形"语法 复制代码 代码如下: //定义   public interface List<E> extends Collection<E>    public class HashMap<K,V> extends AbstractMap<K,V>  implements Map<K,V

  • Java定义泛型接口和类的方法实例分析

    本文实例讲述了Java定义泛型接口和类的方法.分享给大家供大家参考,具体如下: 一 点睛 所谓泛型:就是允许在定义类.接口指定类型形参,这个类型形参在将在声明变量.创建对象时确定(即传入实际的类型参数,也可称为类型实参). JDK1.5改写了集合框架中的全部接口和类,为这些接口.类增加了泛型支持,从而可以在声明集合变量.创建集合对象时传入类型实参. 二 实战 1 代码 // 定义Apple类时使用了泛型声明 public class Apple<T> { // 使用T类型形参定义实例变量 pr

  • Java定义泛型方法实例分析

    本文实例讲述了Java定义泛型方法.分享给大家供大家参考,具体如下: 一 点睛 1 如果定义类.接口是没有使用类型形参,但定义方法时想自己定义类型形参,这也是可以的,JDK1.5还提供了泛型方法的支持. 2 泛型方法的语法格式为: 修饰符 <T , S> 返回值类型 方法名(形参列表) {     //方法体... } 3 泛型方法的方法签名比普通方法的方法签名多了类型形参声明,类型形参声明以尖括号括起来,多个类型形参之间以逗号(,)隔开,所有类型形参声明放在方法修饰符和方法返回值类型之间.

  • java泛型学习示例

    Java泛型(Generics)是JDK5开始引入的一个新特性,允许在定义类和接口的时候使用类型参数(Type Parameter).声明的类型参数在使用时用具体的类型来替换,现在泛型最主要的应用是在JDK5中的新集合类框架中,Map, List均有用到.其中的优点不言而喻,我们可以横向扩展更多的类,缺点呢,其实也就是他的优点,因为这需要我们在使用泛型类的时候,要很清楚自己的代码目地,不能使用错误的类型. 最基本的泛型类 复制代码 代码如下: package com.garinzhang.jav

  • Java使用反射来获取泛型信息示例

    本文实例讲述了Java使用反射来获取泛型信息.分享给大家供大家参考,具体如下: 一 点睛 获得了Field对象后,就可以很容易地获得该Field的数据类型,即使用如下代码即可获得指定Field的类型: //获取Field对象f的类型 Class<?> a = f.getType(); 通过这种方式只对普通类型的Field有效.但如果该Field的类型是有泛型限制的类型,如Map<String , Integer>类型,则不能准确的得到该Field的泛型参数. 为了获得指定Field

  • Java泛型和Class类用法示例

    本文实例讲述了Java泛型和Class类用法.分享给大家供大家参考,具体如下: 一 点睛 从JDK1.5之后,Java的Class类增加了泛型功能,从而允许使用泛型来限制Class类,例如,String.class 的类型实际上是Class<String>. 使用Class<T>泛型可以避免强制类型转换. 二 实战1 import java.util.*; import javax.swing.*; public class CrazyitObjectFactory2 { publ

  • Java 7菱形语法与泛型构造器实例分析

    本文实例讲述了Java 7菱形语法与泛型构造器.分享给大家供大家参考,具体如下: 一 实战--泛型构造器 1 代码 class Foo { public <T> Foo(T t) { System.out.println(t); } } public class GenericConstructor { public static void main(String[] args) { // 泛型构造器中的T参数为String. new Foo("疯狂Java讲义"); //

  • 浅谈java中定义泛型类和定义泛型方法的写法

    1.方法中的泛型 public static <T> T backSerializable(Class<T> clazz , String path ,String fileName){ FileInputStream fis = null; ObjectInputStream ois = null; Object obj = null; try { fis = new FileInputStream(path + fileName); ois = new ObjectInputS

  • Java泛型继承原理与用法详解

    本文实例讲述了Java泛型继承原理与用法.分享给大家供大家参考,具体如下: 一 点睛 当创建了带泛型声明的接口.父类之后,可以为该接口创建实现类,或从该父类来派生子类,但值得指出的是,当使用这些接口.父类时不能再包含类型形参. 如果使用泛型类时没有传入实际的类型参数,Java编译器可能发出警告:使用了未经检查或不安全的操作--这就是泛型检查的警告. 二 实战--传入实际的类型参数 public class A1 extends Apple<String> { // 正确重写了父类的方法,返回值

  • JAVA利用泛型返回类型不同的对象方法

    有时需要在方法末尾返回类型不同的对象,而return 语句只能返回一个或一组类型一样的对象.此时就需要用到泛型. 首先先解释个概念, 元组:它是将一组对象直接打包存储于其中的一个单一对象,这个容器对象允许读取其中元素,但不能修改. 利用泛型创建元组 public class ReturnTwo<A,B> { public final A first; public final B second; public ReturnTwo(A a,B b) { first = a; second = b

  • 基于java中泛型的总结分析

    要我直接说出泛型是个what我还真讲不出来,这里先由一道问题引入: 定义一个坐标点类,要求能保存各种类型的数据,如:整形,浮点型,和字符串类型 既然变量类型起先不确定,那么很容易想到就是用所有类型的父类,也就是Object类来代替 不废话了,用代码来体现 实例1:用Object来实现不确定的数据类型输入 复制代码 代码如下: //这是定义的坐标点类class Point {    private Object x;    private Object y; //用Object来表示不确定的类型 

随机推荐