JAVA 泛型与通配符的使用
泛型的本质是参数化类型。即所操作的数据类型被指定为一个参数。
1.jdk 1.5/1.6 必须显式的写出泛型的类型。
2.jdk 1.7/1.8 不必显式的写出泛型的类型。
一、泛型声明
可以用<T>、<K,V>、<T extends Number>等进行泛型的声明。其中,<T extends Number>的声明方式限定了T的范围,T只能为 Number的子类。
1.参数类型用在类的创建中,泛型类。
2.参数类型用在接口的创建中,泛型接口。
3.参数类型用在方法的创建中,泛型方法。注意泛型<T>的声明位置,在方法的修饰符之后,返回值类型之前。
package me;
public class GeneTest<T> {
private T date;
public T getDate() {
return date;
}
public void setDate(T date) {
this.date = date;
}
}
泛型类
package me;
public interface InteGene<E> {
public E getData();
public void setData(E e);
}
泛型接口
package me;
public class MeGeneTest {
public static <T> void Gene(T test) {
System.out.println(test);
}
public <T> T getDate(T test) {
return test;
}
}
泛型方法
二、? ,类型通配符
通配符的几种形式:
1.无限定通配符,<?>。
2.上限通配符,<? extends Number>。表示参数类型只能是Number的子类。
3.下限通配符,<? supper Number>。表示参数类型只能是Number的父类。
package me;
public class Test {
public static void main(String[] args) {
GeneTest<String> gts = new GeneTest<>();
gts.setDate("this is a test !");
print(gts);
GeneTest<Integer> gti = new GeneTest<>();
gti.setDate(123);
print(gti);
}
public static void print(GeneTest<?> s){
System.out.println(s.getDate());
}
}
通配符的使用
上面的示例代码中,print()方法的参数使用了通配符,得以传入泛型类GeneTest<T>任意类型的参数。如果,将通配符改成具体的一种类型,例如String类型。那print()方法就只能传入泛型类GeneTest<String>类型的参数。
泛型的声明表明,在类、接口、方法的创建中,要使用一个未知的数据类型,将来可能会用到的一种数据类型。它可以是Integer类型,也可以是String类型。就把它的类型定义成 T 、K 或者是V等等。
在实例化的时候,就必须声明T具体是一个什么类型。
在定义泛型对象的使用方法时,还不知道T是什么类型,它可能是String类型,也可能是Integer类型。如果,把T定义成一个确定的泛型数据类型,参数就只能是这种数据类型。此时,就用到了通配符代替确定的泛型数据类型。
使用泛型、通配符提高了代码的复用性。
把一个对象分为声明、使用两部分的话。泛型侧重于类型的声明上代码复用,通配符则侧重于使用上的代码复用。泛型用于定义内部数据类型的不确定性,通配符则用于定义使用的对象类型不确定性。
JAVA 泛型与通配符的使用的更多相关文章
- Java泛型和通配符那点事
泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法 ...
- java 泛型的通配符和限定
package cn.sasa.demo1; import java.util.ArrayList; import java.util.Collection; import java.util.Ite ...
- Java泛型之通配符
原文点此链接 使用通配符的原因:Java中的数组是协变的,但是泛型不支持协变. 数组的协变 首先了解下什么是数组的协变,看下面的例子: Number[] nums = new Integer[10]; ...
- Java 泛型、通配符? 解惑
Java 泛型通配符?解惑 分类: JAVA 2014-05-05 15:53 2799人阅读 评论(4) 收藏 举报 泛型通配符上界下界无界 目录(?)[+] 转自:http://www.linux ...
- Java 泛型和通配符解惑
转自:http://www.linuxidc.com/Linux/2013-10/90928.htm T 有类型 ? 未知类型 一.通配符的上界 既然知道List<Cat>并不是Lis ...
- java 泛型与通配符(?)
泛型应用于泛型类或泛型方法的声明. 如类GenericTest public class GenericTest<T> { private T item; public void set( ...
- java泛型之通配符?
一.在说泛型通配符" ?" 之前先讲几个概念 1.里氏替换原则(Liskov Substitution Principle, LSP): 定义:所有引用基类(父类)的地方必须能透明 ...
- java 泛型: 通配符? 和 指定类型 T
1. T通常用于类后面和 方法修饰符(返回值前面)后面 ,所以在使用之前必须确定类型,即新建实例时要制定具体类型, 而?通配符通常用于变量 ,在使用时给定即可 ? extends A : 通配符上 ...
- [转]JAVA泛型通配符T,E,K,V区别,T以及Class<T>,Class<?>的区别
原文地址:https://www.jianshu.com/p/95f349258afb 1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被 ...
随机推荐
- 【01:转自知乎:关于 openSUSE 】
我是 openSUSE 中文维基唯一的非官方维护者,openSUSE 简体中文翻译团队召集人,linuxsir SuSE 版块的版主,openSUSE 官方论坛 http://forums.opens ...
- Openstack命令行创建不同vlan段虚拟机
默认使用nova-network的vlan模式,但是在使用默认的dashboard的时候,不能指定创建的虚拟机的使用网段,固定IP地址. 实际上该功能是在存在的,只是openstack的dashbbo ...
- Python对整形数字进行加密和解密
# -*- coding:utf-8 -*- __author__ = 'Ray' class Encryption: """整形数字简单的一个加密/解密算法" ...
- 2016年12月23日 星期五 --出埃及记 Exodus 21:18
2016年12月23日 星期五 --出埃及记 Exodus 21:18 "If men quarrel and one hits the other with a stone or with ...
- iptables交互配置shell脚本
#!/bin/bash while true do clear echo "———————-menu————————" echo -e "\033[49;32;1m(1) ...
- C#报修系统Ⅱ
用户需求: 1.用户可以注册,可以登录. 2.需要一个报修界面,当点击“报修”按钮时,软件会把用户报修的信息保存起来,更新报修次数,同时会清空相应的文本框,软件还要要检查所有文本框是否为空,空的话给出 ...
- PHP中的闭包和匿名函数
闭包的概念是指在创建闭包时,闭包会封装周围的状态的函数.即便闭包所在环境不在了.但闭包中封装的状态依然存在. 匿名函数就是没有名称的函数. 它们看似很函数一样,实际上它们属于Closure类的实例 P ...
- Linux文件管理相关命令
Linux文件管理相关命令 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在了解了Linux文件管理背景知识之后, 我们可以 ...
- Vector成员为指针时要注意的问题
vector的复制是浅复制,所以复制一个包含动态内存的变量的对象的话就会出问题. 解决办法:自己写类的复制构造函数,为新对象的指针开辟新的内存空间. 但当vector离开作用域之后,只会把其成员所占的 ...
- java程序调用存储过程
java程序调用存储过程 PL/SQL子程序,很多情况下是给应用程序来调用的,所有我们要掌握使用其他编程语言来调用我们写好的存储过程.下面我们介绍下使用java调用Oracle的存储过程. ...