在平时写代码时,可以自定义泛型类。当使用同一类型的对象时,这是非常有用的,但在实例化类之前,我们不知道它将是哪种类型。

下面让我们定义一个使用泛型参数的方法。首先,在定义一个类用到泛型时,必须使用特殊语法来支持这种类型。在下面的例子中,<T>表示定义的类将要使用的类型:

public class MyGeneric<T> {

当然,也可以定义泛型中包含多个类的类型,比如java.util.Map

public class MyGeneric<T, U, V> {  }

接下来,我们定义一个完整的类,其中包含ArrayList对象,用来存放''类型的对象,并在构造方法中实例化ArrayList对象。

import java.util.ArrayList;

public class MyGeneric<T> {

    private ArrayList<T> list;

    public MyGeneric() {
list = new ArrayList<T>();
} public void add(T element) {
list.add(element);
}
}

需要注意的是,我们实际上并不是处理一个名为T的类。相反,T是用于创建MyGeneric实例时使用的类型。 Java规范允许使用所需的任何标识符,但标准约定是使用单个大写字母将其与正常类名称区分开来。 现在我们已经将add方法定义为T类型的参数,只能使用与MyGeneric实例构造相同的类型。 以下代码是非法的,并产生编译错误:

MyGeneric<String> rs = new MyGeneric<>();
rs.add(1); // illegal for a MyGeneric<String>

如果要从方法返回泛型类型,则可以将其作为方法签名的返回类型,定义所示:

SecureRandom random = new SecureRandom();
// 省略其他代码 public T getRandomElement() {
int index = random.nextInt(list.size());
return list.get(index);
}

getRandomElement方法返回类型与定义类的类型是一致的。现在,我们就可以使用上面的方法,来构建类型实例。

public static void main(String [] args) {
MyGeneric<String> names = new MyGeneric<>();
names.add("zhangsan");
names.add("lisi");
names.add("wangwu");
names.add("zhaoliu"); // 随机获取list的一个元素
String name = names.getRandomElement();
System.out.println(name);
}

String类型变量names的赋值是安全的,我们将始终从getRandomElement方法获取一个字符串。 这只是因为我们使用String类型构造了MyGeneric实例。 addgetRandomElement方法的定义与构造函数的定义具有相同的类型,编译器将强制执行此约束。 让我们尝试在构造函数中使用不同类型的MyGeneric类,这次使用我们Integer类:

MyGeneric<Integer> numbers = new MyGeneric<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4); Integer oneNumber = numbers.getRandomElement();
System.out.println(oneNumber);

你可以在需要类处理某些类型的对象(在构建类之前不知道),以及希望编译器严格执行类型限制的情况下定义自己的泛型。这样做的主要优点是安全和方便。

最后,附上完整的实例代码:

package wicked.coo;

import java.security.SecureRandom;
import java.util.ArrayList; /**
*
* @author i324779
*
* @param <T> 自定义泛型
*/
public class MyGeneric<T> { SecureRandom random = new SecureRandom(); private ArrayList<T> list; public MyGeneric() {
list = new ArrayList<T>();
} public void add(T element) {
list.add(element);
} public T getRandomElement() {
int index = random.nextInt(list.size());
return list.get(index);
} public static void main(String [] args) {
MyGeneric<String> names = new MyGeneric<>();
names.add("zhangsan");
names.add("lisi");
names.add("wangwu");
names.add("zhaoliu"); // 随机获取list的一个元素
String name = names.getRandomElement();
System.out.println(name); MyGeneric<Integer> numbers = new MyGeneric<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4); Integer oneNumber = numbers.getRandomElement();
System.out.println(oneNumber);
}
}

Happy Java:定义泛型参数的方法的更多相关文章

  1. java(11)带参数的方法

    一.java中的包(package) 1.1 包,对应到磁盘中的文件夹 1.2 新建一个class,默认保存在缺省包中 1.3 声明包的关键字:package package语句,置顶位置 1.4 导 ...

  2. JAVA的带参数的方法

    一.带参数的方法 1.1 语法:                            <访问修饰符>  返回类型  <方法名>(<形式参数列表>) { //方法的 ...

  3. Java 传递可变参数和方法重载

    形式:类型... 参数名 示例:public void show(int... a) {}; 可变参数在方法中被当作数组来处理 可变参数传值的四种方式: 一个值也不传,可变参数会接收到长度为0的数组 ...

  4. java不确定参数个数方法例子

    package test; public class myTest { // 根据输入的参数动态生成数组 public static int max(int... param) { int max = ...

  5. Java 第13章 带参数的方法

    带参数的方法 无参方法有那几个组成部分? 调用无参方法的两种形式是什么? 第一种:同一个类中的方法调用 直接用方法名 show(): 第二种:不同类中的方法调用 -->对象实例化 -->对 ...

  6. java<T>泛型

    泛型 1.泛型的概述 在JDK1.5之前,把对象放入到集合中,集合不会记住元素的类型,取出时,全都变成Object类型.泛型是jdk5引入的类型机制,就是将类型参数化,它是早在1999年就制定的jsr ...

  7. Java反射机制二 获取方法的返回值或参数的泛型信息

    在使用反射机制时,我们经常需要知道方法的参数和返回值类型,很简单  ,下面上示例,示例中的两个方法非常相似 package deadLockThread; import java.lang.refle ...

  8. Java方法的定义以及调用、方法重载、可变参数以及递归

    目录 何谓方法 方法的定义及调用 方法的定义 方法调用 方法重载 命令行传参 可变参数 递归 何谓方法 Java方法是语句的集合,它们在一起执行一个功能 方法是解决一类问题的步骤的有序组合 方法包含于 ...

  9. 初识Java泛型以及桥接方法

    泛型的由来 在编写程序时,可能会有这样的需求:容器类,比如java中常见的list等.为了使容器可以保存多种类型的数据,需要编写多种容器类,每一个容器类中规定好了可以操作的数据类型.此时可能会有Int ...

随机推荐

  1. 构造并发送Beacon帧以伪造任意WiFi热点

    请想象一下这样的情景:你可以任意伪造很多个WiFi热点, 这个技术只能在linux上使用,而且对无线网卡也有一定的挑剔,具体的下面会讲- 阶段一:基本原理 首先需要搞清楚的是,手机.电脑等支持WiFi ...

  2. scala VS python2 (linux or shell)

    PS:只考虑最新版的scala和python2.x,由于python3.x和python2.x区别比较大,而且主流的一些开源项目都用的python2,目前python2一点点在兼容python3 1. ...

  3. Java继承Exception自定义异常类教程以及Javaweb中用Filter拦截并处理异常

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6403033.html 在项目中的应用见: https://github.com/ygj0930/CoupleS ...

  4. JDK提供的四种线程池

    一.线程池什么时候用,有什么好处? “线程池”顾名思义,就是存放线程的池子,这个池子可以存放多少线程取决于采用哪种线程池,取决于有多少并发线程,有多少计算机的硬件资源.使用线程池最直接的好处就是:线程 ...

  5. 【Android】ant编译aidl的错误

    使用ant编译Android应用程序工程时,出现的错误: 错误信息(Cygwin): [aidl] This application has requested the Runtime to term ...

  6. V-rep学习笔记:碰撞检测与距离计算

    V-REP可以在几何组件中快速判断各种干扰与碰撞,以及计算多个组件间的最小距离. 碰撞检测 V-REP可以检测两个碰撞体实体(Collidable objects are objects that c ...

  7. django之创建第7-3个项目-在站点blog下单独创建urls.py文件

    1.在站点blog下单独创建urls.py文件 # -*- coding: UTF-8 -*- from django.conf.urls import patterns, include, url ...

  8. python3新特点

    #xiaodeng #python 3 #1.编码方式和性能 ''' 1.py3运行效率更快 2.默认源文件编码ASCII变为UTF-8,以前文件前加入的coding=utf-8不再需要 3.针对un ...

  9. java 怎么打印变量

    //Test.java public class Test16{ public static void main(String args[]){ int age=28; System.out.prin ...

  10. XML文件生成C++代码(基于rapidxml)

    简述 与XML文件生成C++代码(基于pugixml)中的功能一致,只是这里改用的rapidxml来实现.就不多说了,直接放代码. 代码 #include "rapidxml-1.13/ra ...