Java泛型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java泛型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3698字,纯文字阅读大概需要6分钟。
内容图文
![Java泛型](/upload/InfoBanner/zyjiaocheng/828/ecdf9946765e4752b1caf6c4cb44bc19.jpg)
java 泛型,英文原名generics, generic 发音/d???n?r?ks/,含义为adj.一般的;普通的;通用的;
由泛型的英文原意我们可猜想泛型大致的作用。
始于:JDK5
泛型的作用:提供编译时类型安全检测,在编译阶段检测非法的类型
泛型的本质是参数化类型,所操作的数据类型被指定为一个参数。
为什么需要创造泛型这个工具?
我们说泛型是一个工具,它是为了解决某种实际问题而被创造出来的。
我们查阅资料找到泛型的起源:
我们知道普通的java方法能够接受的参数类型是固定的,如果我们要调用同一个方法(相同方法名)但需要传入不同类型的参数时我们就需要用到方法的重载,但重载的问题是我们需要为每一种可能的参数类型写一个重载方法。如果需要传入多种参数类型,这会大大增加开发工作量。
这时我们的大神JDK设计师们发明了泛型这个工具来将方法的参数类型参数化,使方法能够动态的接受不同类型的参数,这样就不需要再写多个重载的方法,大大减少了代码量。
根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。泛型方法是面向编译器的
定义泛型方法的规则:
1.类型参数声明(由尖括号<>分隔),类型参数声明 应放置在 方法返回类型声明 之前
2.每一个 类型参数声明 包含一个或多个 类型参数(又称类型变量),参数间用逗号隔开。
3.类型参数 可以作为 返回值类型声明,能作为泛型方法得到的实际参数类型的占位符。
4.泛型方法体的声明和其他方法一样,类型参数只能传入引用型类型,不能是原始类型。
示例:
public class GenericMethodTest {
public static < X > void printArray( X[] inputArray ) {
for ( X element : inputArray ){
System.out.printf( "%s ", element );
}
System.out.println();
}
}
示例:
有界的类型参数:
按照普通定义的泛型方法可接受所有类型的 参数, 当我们需要限定传入的参数类型范围时怎么办?如:在某个场景我只需要接收Number或者Number子类实例。这时我们的大神JDK设计师们就提供了 有界类型参数 来满足这种需求。
定义方法:
在 类型参数名称 后加上 extends(不能是implements) 接限定类型的上界。
示例:
public class MaximumTest{
public static <T extends Comparable<T>> T maximum(T x, T y, T z) {
T max = x; // 假设x是初始最大值
if ( y.compareTo( max ) > 0 ){
max = y; //y 更大
}
if ( z.compareTo( max ) > 0 ){
max = z; // 现在 z 更大
}
return max; // 返回最大对象
}
public static void main( String args[] ) {
System.out.printf( "%d, %d 和 %d 中最大的数为 %d\n\n",
3, 4, 5, maximum( 3, 4, 5 ) );
System.out.printf( "%.1f, %.1f 和 %.1f 中最大的数为 %.1f\n\n",
6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) );
System.out.printf( "%s, %s 和 %s 中最大的数为 %s\n","pear",
"apple", "orange", maximum( "pear", "apple", "orange" ) );
}
}
泛型类:
如果我们需要在一个类中定义动态的属性的类型,则可以使用泛型类。
泛型类定义:
在类名后接<类型变量1, 类型变量2, 类型变量3,..>
泛型类声明:
类目<具体类型1,具体类型2,具体类型3,...>
示例:
public class Box<F> {
private F f;
public F getF() {
return f;
}
public void setF(F f) {
this.f = f;
}
public static void main(String[] args) {
Box<Double> doubleBox = new Box<>();
Box<Class> classBox = new Box<>();
doubleBox.setF(3.1415926);
classBox.setF(Class.class);
System.out.printf("浮点数为:%f\n\n", doubleBox.getF());
System.out.printf("类为:%s\n\n", classBox.getF());
}
}
类型通配符: ?
用?代替具体的类型参数,代表允许传入任何类型的类型
public static void getData(List<?> data) { System.out.println("data :" + data.get(0)); }
通配符上限: ? extends 上限类型
public static void getData(List<? extends Number> data) {
System.out.println("data :" + data.get(0));
}
通配符下限: ? super Number
public static void getData(List<? super Number> data) {//表示只能接受Number及其父类类型
System.out.println("data :" + data.get(0));
}
内容总结
以上是互联网集市为您收集整理的Java泛型全部内容,希望文章能够帮你解决Java泛型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。