java方法参数泛型_Happy Java:定义泛型参数的方法

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

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

public class MyGeneric {

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

public class MyGeneric { }

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

import java.util.ArrayList;

public class MyGeneric {

private ArrayList list;

public MyGeneric() {

list = new ArrayList();

}

public void add(T element) {

list.add(element);

}

}

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

MyGeneric rs = new MyGeneric<>();

rs.add(1); // illegal for a MyGeneric

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

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 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实例。 add和 getRandomElement方法的定义与构造函数的定义具有相同的类型,编译器将强制执行此约束。 让我们尝试在构造函数中使用不同类型的MyGeneric类,这次使用我们Integer类:

MyGeneric 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 自定义泛型

*/

public class MyGeneric {

SecureRandom random = new SecureRandom();

private ArrayList list;

public MyGeneric() {

list = new ArrayList();

}

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 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 numbers = new MyGeneric<>();

numbers.add(1);

numbers.add(2);

numbers.add(3);

numbers.add(4);

Integer oneNumber = numbers.getRandomElement();

System.out.println(oneNumber);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值