泛型--前世今生


1、什么是泛型?


  泛型:任意的类型。是一种把明确数据类型的工作放在了创建对象或者调用方法时候进行的特殊的类型,一般只应用在集合里。

  泛型的格式:<数据类型>,举例如下:

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



2、为什么有泛型?泛型有什么好处?


  为什么有泛型:我们知道,数组只能存储一种数据类型;集合可以存储任意类型的对象,但是我只想让我的存储一种类型,不想让其他类型存进去,怎么解决呢?

  这时候就要用泛型了,泛型就是模仿数组限定存入数据类型而来的,在定义集合的时候,告诉集合,限定集合只能存储什么类型的元素(如果不明确指定则默认是object类型)。以上面泛型举例,ArrayList<String> array = new ArrayList<String>();就是限定集合array只能存入string类型数据。

  泛型的好处:

    (1)解决了虚拟机黄色警告问题,因为如果不加泛型的话,虚拟机会认为存在因操作失误存入非正常数据的可能,而报出黄色警告。

    (2)把运行期间的类型转换异常提前到了编译期间,定义泛型之后,如果存入非泛型规定类型数据,虚拟机会报错而导致编译不通过。

    (3)优化程序设计,使得代码更清晰。

3、什么时候使用泛型?


  如果类或者接口后面有 < > ,那么这就是泛型的体现。它就是要你在使用的时候明确类型,这时候就可以使用泛型了。



4、泛型的种类?


  泛型一般的用法有泛型类、泛型方法、泛型接口。

  (1)泛型类


    顾名思义,泛型类就是把泛型定义在类上。举例如下:

public class Tool2<E> {  // 泛型不明确类型则默认object类型

	private E temp;

	public void show(E e) {
		System.out.println( 胡根得 );
	}
}

    定义成这样,说明方法传递的参数必须和泛型类的类型一致,这时候,泛型类的使用方法如下:

<span style="font-size:14px;">public class Tool2Test {
	public static void main(String[] args) {

		Tool2<String> t = new Tool2<String>(); //泛型类定义成string类型
		t.show("hello");

		Tool2<Integer> t2 = new Tool2<Integer>(); //泛型类定义成Integer类型
		t2.show(10);
	}
}</span>

  

  (2)泛型方法


    从上边可以知道,我们用泛型类可以使得泛型类的方法传递不同类型的参数(上面分别传递了string和Integer类型),但是我们需要在泛型类和其方法上都加上泛型。那么,我们能不能在调用方法的时候,才去明确类型呢?

    这就用到了泛型方法,泛型方法就是把泛型加在方法上。举例如下:

public class Tool {

	//泛型方法
	public <E> void show(E e) { //没有指定,所以默认object类型均可
		System.out.println( 胡根得 );
	}
}

    使用的时候:

public class ToolTest {
	public static void main(String[] args) {

		//不用在类上也加上泛型啦!
		Tool t = new Tool();

		t.show("hello");
		//真正实现了一个方法,传递多种参数,比方法重载简单多了
		t.show(10);
	}
}

  (3)泛型接口


    把泛型加在接口上。泛型接口有什么特点呢?

    首先定义一个泛型接口:

//定义泛型接口
public interface Inter<BMW> { //没有指定类型,默认为object类型
	public abstract void show(BMW bmw);
}

    定义类实现这个接口:

  (1)在写实现类的时候,已经知道接口上应该是什么类型了,例如应该是string类型:

//直接加上类型string
public class InterImpl implements Inter<String> { //在泛型处指定string类型
	@Override
	public void show(String bmw) {
		System.out.println(bmw);
	}
}

    调用方式:

public class InterTest {
	public static void main(String[] args) {
		// 方式1测试
		 InterImpl ii = new InterImpl(); //直接创建对象
		 ii.show("hello");
	}
}

  (2)在写实现类的时候,不知道接口上应该是什么类型:

public class InterImpl<BWM> implements Inter<BWM> {//这时候类上的泛型仍然用父接口中的bwm类型
	@Override
	public void show(BWM bmw) {
		System.out.println(bmw);
	}

    调用方式:

public class InterTest {
	public static void main(String[] args) {

		// 方式2测试,调用的时候才定义类型
		InterImpl<String> ii = new InterImpl<String>(); //需要用泛型类的方式创建对象
		ii.show("hello");
	}
}

  小结:泛型属于新特性,是高新类技术,在很多方面多有用处。既可以规定必须用哪种类型,又可以代替方法重载,传递多种参数。

时间: 2024-09-29 10:23:57

泛型--前世今生的相关文章

Java基础-16总结List的子类,ArrayList,Vector,LinkedList,泛型,增强for循环,静态导入,可变参数

你需要的是什么,直接评论留言. 获取更多资源加微信公众号"Java帮帮" (是公众号,不是微信好友哦) 还有"Java帮帮"今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流QQ群553841695 分享是一种美德,分享更快乐! 1:List的子类(掌握) (1)List的子类特点 ArrayList: 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector: 底层数据结构是数组,查询快,增删慢 线程安全,效率低 Linked

java se-使用泛型打印输出任意类型的数组,为什么调用时有错误?

问题描述 使用泛型打印输出任意类型的数组,为什么调用时有错误? import java.util.Arrays; public class FanXing { public static void printMatrix(T[][] matrix){ for(int i=0;i<matrix.length;i++){ System.out.println(Arrays.toString(matrix[i])); } } public static void main(String[] args)

诊断Java代码: 轻松掌握 Java 泛型,第4部分

至此,在这个讨论 JSR-14 和 Tiger 中泛型类型的微型系列中,我们已经探讨了: 泛型类型及被设计成支持它们的即将发布的功能 基本类型.受约束的泛型以及多态方法上的限制 几个强加给这些 Java 扩展的限制 这些扩展语言的编译器所用的实现策略如何使这些限制成为必需 在泛型类型中添加对"裸"类型参数的 new 操作的支持所带来的影响 本月,我们将探讨在可以处理 mixin(可能被期望是泛型类型中最强大的功能)之前需要先解决的问题,以此来结束对 Java 语言中泛型类型的讨论. m

诊断Java代码: 轻松掌握Java泛型,第3部分

这一系列主要讨论在 Java 编程中添加泛型类型,本文是其中的一篇,将研究还未讨论过的有关使用泛型的两个限制之一,即添加对裸类型参数的 new 操作的支持(如类 C<T> 中的 new T() ). 正如我 上个月所提到的那样,Tiger 和 JSR-14 通过使用"类型消除(type erasure)"对 Java 语言实现泛型类型.使用类型消除(type erasure),泛型类型仅用于类型检查:然后,用它们的上界替换它们.由此定义可知:消除将与如 new T() 之类

泛型-c# 动态创建控件 及触发事件 即插即用。

问题描述 c# 动态创建控件 及触发事件 即插即用. 各大大好,初来驾到,请大家多多关照,问题是这样的.需求 :需要动态添加控件.然后需要项目做出来后要实现"即插即用"的特点.(即插即用:我们要是更新一个功能,用户只要更新这个控件就可以直接使用,而不用更新整个客服端)问题 :知道要用泛型来写,但是看了一天了,不知道如何下手,现已写了如下代码:using System;using System.Collections.Generic;using System.Linq;using Sys

泛型

 什么是Java泛型                1.java泛型是java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法.                2.java泛型可以让你消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中.这就是泛型所做的工作. 为什么要有泛型 先来看看以下代码,        publi

泛型T 如何在扩展方法中使用?

问题描述 泛型T 如何在扩展方法中使用? 本来想了解一下扩展方法,但是看到文库中的实例明显有问题,特来提问 泛型对象T 如何使用Length 属性? 可以像类中一样加继承于某某类的约束吗? http://wenku.baidu.com/link?url=Vz-Cjrq24tvblbk0l1I4IPYYfZ82jkGpzGBoNBDhi6qSCJko9hSTcrKGWrunO91TqTgyqB0AMvueHUP1or-mi8ktWMejceDW6Y-OphMnBh7 public static c

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, 

关于泛型实例声明类型的问题,问题在注释里面

问题描述 关于泛型实例声明类型的问题,问题在注释里面 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(); //请问,new ArrayList()中,这里面的Manager有什么用吗?