Happy Java:定义泛型参数的方法
2017-10-19 23:45
489 查看
在平时写代码时,可以自定义泛型类。当使用同一类型的对象时,这是非常有用的,但在实例化类之前,我们不知道它将是哪种类型。
下面让我们定义一个使用泛型参数的方法。首先,在定义一个类用到泛型时,必须使用特殊语法来支持这种类型。在下面的例子中,
当然,也可以定义泛型中包含多个类的类型,比如
接下来,我们定义一个完整的类,其中包含
需要注意的是,我们实际上并不是处理一个名为
如果要从方法返回泛型类型,则可以将其作为方法签名的返回类型,定义所示:
对
你可以在需要类处理某些类型的对象(在构建类之前不知道),以及希望编译器严格执行类型限制的情况下定义自己的泛型。这样做的主要优点是安全和方便。
最后,附上完整的事例代码:
下面让我们定义一个使用泛型参数的方法。首先,在定义一个类用到泛型时,必须使用特殊语法来支持这种类型。在下面的例子中,
<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实例。
add和
getRandomElement方法的定义与构造函数的定义具有相同的类型,编译器将强制执行此约束。 让我们尝试在构造函数中使用不同类型的
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);
}
}
相关文章推荐
- [bxd学习java基本点]13泛型类,泛型方法,当定义二种类型的泛型方法时,用迭代器的方法
- java 泛型使用和不定参数函数定义
- java中在方法中定义不定长参数示例
- Java中可变长参数方法的定义和使用
- java获取泛型参数的类型的方法 - 实例讲解
- java 定义泛型方法
- Java学习笔记003——继承、抽象类、类相等测试、泛型数组列表、可变参数方法
- java中定义泛型类和定义泛型方法的写法
- 浅谈java中定义泛型类和定义泛型方法的写法
- Java泛型类定义,与泛型方法的定义使用
- java再复习——通过反射获取到方法的参数和返回值的泛型类型
- 定义可选参数的Java方法
- Java 泛型方法的定义
- JAVA一种获得泛型类泛型参数Class对象的方法
- java取得泛型的参数类型(Gson通过借助TypeToken获取泛型参数的类型的方法)
- 关于java中可变长参数的定义及使用方法详解
- Java获取泛型参数的类型的方法 .
- java中可变长参数的定义及使用方法
- [bxd学习java基本点]13泛型类,泛型方法,当定义二种类型的泛型方法时,用迭代器的方法
- java 定义泛型方法