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

下面让我们定义一个使用泛型参数的方法。首先,在定义一个类用到泛型时,必须使用特殊语法来支持这种类型。在下面的例子中,<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. C#.NET常见问题(FAQ)-如何修改Form不能修改窗体大小

    把FormBorderSytle改一下就可以了,改成FixedSingle或者Fixed3D都可以   更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com ...

  2. android studio开发的时候出现design editor is unavailable until after a successful project sync问题的解决方法

    android studio设计界面的时候,出现了报错:design editor is unavailable until after a successful project sync,导致无法编 ...

  3. keytab生成不了

    vim /var/kerberos/krb5kdc/kadm5.acl 将*e改成* /etc/init.d/kadmin restart 重启kadmin

  4. js 原型链 prototype __proto__

    1.说明 函数(Function)才有prototype属性,对象(除Object)拥有__proto__. 2.prototype与__proto__区别 示例: <!DOCTYPE html ...

  5. Cas Server源码编译现场实例

    最近公司有项目需要做单点登录,根据要求就写下这篇从github上下载的包到项目编译通过,再到修改原代码实现自己的特殊逻辑. 前提: java环境 tomcat环境 maven环境 MyEclipse开 ...

  6. nodejs直接调用grunt(非调用批处理)

    在windows下,我们做js构建工作,都习惯安装grunt-cli,只需要命令行grunt...一切构建工作都自动完成了.这已经是很完美的情况了,不过最近要做一个服务器版的自动化构建系统,在node ...

  7. eclipse mavenWeb项目真正实现热部署(修改java代码和页面文件不用重启tomcat)

            1.前言 首先,本文创作灵感源于博客园园作者signheart,特此鸣谢!原文链接见文末推荐: 百度都搜破了,全网讲的都是如何将maven项目部署到tomcat上,对于热部署的认知,真 ...

  8. 【Linux】ssh建立隧道tunnel连接到内网设备

    root@192.168.1.105 建立隧道: ssh -l root -N -f -R 9103:127.0.0.1:2222 work@11.11.13.17 解析:把本地127.0.0.1:2 ...

  9. 【shell】创建长目录,目录存在则忽略,缺失则创建

    有时候,我们需要创建一个空目录树,如果给定路径包含目录,那么还必须检查这些目录是否存在: mkdir –p /qinys/oliver/tmp/ 执行上述命令即可创建长目录,并且有则忽略,无则创建原则 ...

  10. django之创建第4个项目编写第一个动态模板文件

    修改的地方: 1.index.html <!DOCTYPE html> <html lang="en"> <head> <meta cha ...