在日常的开发中,我们会看到别人的框架很多地方会使用到泛型,泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。本篇博客我们就来详细解析一下泛型的知识。
publicclass ObjClass {
private T x ;
private T y ;
public T getX() {
return x;
}
publicvoidsetX(T x) {
this.x = x;
}
public T getY() {
return y;
}
publicvoidsetY(T y) {
this.y = y;
}
}
private T x ;
private T y ;
public T getX() {
return x;
}
publicvoidsetX(T x) {
this.x = x;
}
public T getY() {
return y;
}
publicvoidsetY(T y) {
this.y = y;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
3.使用泛型类 泛型类的使用代码如下:
ObjClass<String> stringClass = new ObjClass<String>();
stringClass.setX("haha");
ObjClass<Integer> intClass = new ObjClass<Integer>();
intClass.setX(100);
1
2
3
4
5
1
2
3
4
5
首先,需要构造一个实例:
ObjClass<String> stringClass = new ObjClass<String>();
publicclass ObjClass {
private T x ;
private U y ;
public T getX() {
return x;
}
publicvoidsetX(T x) {
this.x = x;
}
public U getY() {
return y;
}
publicvoidsetY(U y) {
this.y = y;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ObjClass<String,Integer> stringClass = new ObjClass<String,Integer>();
stringClass.setX("haha");
stringClass.setY(100);
1
2
3
1
2
3
从上面的代码中,可以明显看出,就是在新添加的泛型变量U用法与T是一样的。
2.泛型的字母规范 虽然在类中声明泛型任意字母都可以,但为了可读性,最好遵循以下的规范:
E — Element,常用在java Collection里,如: List<E>,Iterator<E>,Set<E>
K,V — Key,Value,代表Map的键值对
N — Number,数字
T — Type,类型,如String,Integer等等
1
2
3
4
1
2
3
4
泛型接口定义及使用
在接口上定义泛型与在类中定义泛型是一样的,代码如下:
interface MsgClass {
public T getMsg() ;
publicvoidsetMsg(T x);
}
1
2
3
4
1
2
3
4
我们可以利用泛型类来构造填充泛型接口
publicclassMessage<T,U> implementsMsgClass<T>{private T msg;
@Override
public T getMsg() {
return msg;
}
@Override
publicvoid setMsg(T msg) {
this.msg = msg;
}
}
class Info{
private T var ; // 定义泛型变量publicvoidsetVar(T var){
this.var = var ;
}
public T getVar(){
returnthis.var ;
}
public String toString(){
returnthis.var.toString() ;
}
};
publicclass demo1 {
publicstaticvoidmain(String args[]) {
// 使用String为泛型类型
Info i = new Info();
i.setVar("ABCD");
//把String泛型类型的i对象传递给Object泛型类型的temp。
fun(i);
}
// 接收Object泛型类型的Info对象publicstaticvoidfun(Info
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
编译发生错误。
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method fun(Info<Object>) in the type demo1 isnot applicable for the arguments (Info<String>)
at Thread1.demo1.main(demo1.java:18)
class Info{
private T var ;
publicvoidsetVar(T var){
this.var = var ;
}
public T getVar(){
returnthis.var ;
}
public String toString(){
returnthis.var.toString() ;
}
};
publicclass GenericsDemo{
publicstaticvoidmain(String args[]){
Info i = new Info() ;
i.setVar("ABCD") ;
fun(i) ;
}
publicstaticvoidfun(Info> temp){
System.out.println("内容:" + temp) ;
}
};
class Info{
private T var ;
publicvoidsetVar(T var){
this.var = var ;
}
public T getVar(){
returnthis.var ;
}
public String toString(){
returnthis.var.toString() ;
}
};
publicclass demo1{
publicstaticvoidmain(String args[]){
Info> i = new Info() ;
i.setVar("ABCD") ;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
运行结果:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method setVar(capture#1-of ?) in the type Info1-of ?> isnot applicable for the arguments (String)
at Thread1.demo1.main(demo1.java:17)
1
2
3
4
1
2
3
4
在使用”?“只能接收,不能修改。
泛型的上限
class Info{
private T var ;
publicvoidsetVar(T var){
this.var = var ;
}
public T getVar(){
returnthis.var ;
}
public String toString(){
returnthis.var.toString() ;
}
};
publicclass GenericsDemo{
publicstaticvoidmain(String args[]){
Info i1 = new Info() ;
Info i2 = new Info() ;
i1.setVar(30) ;
i2.setVar(30.1f) ;
fun(i1) ;
fun(i2) ;
}
publicstaticvoidfun(Info extends Number> temp){ // 只能接收Number及其Number的子类
System.out.print(temp + "、") ;
}
};
class Info{ // 此处泛型只能是数字类型private T var ;
publicvoidsetVar(T var){
this.var = var ;
}
public T getVar(){
returnthis.var ;
}
public String toString(){
returnthis.var.toString() ;
}
};
publicclass demo1{
publicstaticvoidmain(String args[]){
Info i1 = new Info() ; // 声明Integer的泛型对象
}
};
class Info{
private T var ;
publicvoidsetVar(T var){
this.var = var ;
}
public T getVar(){
returnthis.var ;
}
public String toString(){
returnthis.var.toString() ;
}
};
publicclass GenericsDemo21{
publicstaticvoidmain(String args[]){
Info i1 = new Info() ; //
Info
.oracle层次查询(connect by)
oracle的emp表中包含了一列mgr指出谁是雇员的经理,由于经理也是雇员,所以经理的信息也存储在emp表中。这样emp表就是一个自引用表,表中的mgr列是一个自引用列,它指向emp表中的empno列,mgr表示一个员工的管理者,
select empno,mgr,ename,sal from e
SAPHANA平台有各种各样的应用场景,这也意味着客户的实施方法有许多种选择,关键是如何挑选最适合他们需求的实施方案。
在 《Implementing SAP HANA》这本书中,介绍了SAP平台在现实场景中的运作原理,并给出了实施建议和成功案例供参考。本系列文章节选自《Implementing SAP HANA》,介绍了行存储和列存储的各自特点,以及SAP HANA的数据存储方式如何提升空间压
学习Java有没有什么捷径?要想学好Java,首先要知道Java的大致分类。自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE
JSF 2.0 introduced annotation @ViewScoped; A bean annotated with this scope maintained its state as long as the user stays on the same view(reloads or navigation - no intervening views). One problem w
很多文档说Zookeeper是强一致性保证,事实不然。关于一致性模型请参考http://bit1129.iteye.com/blog/2155336
Zookeeper的数据同步协议
Zookeeper采用称为Quorum Based Protocol的数据同步协议。假如Zookeeper集群有N台Zookeeper服务器(N通常取奇数,3台能够满足数据可靠性同时
Spring Security提供了一个实现了可以缓存UserDetails的UserDetailsService实现类,CachingUserDetailsService。该类的构造接收一个用于真正加载UserDetails的UserDetailsService实现类。当需要加载UserDetails时,其首先会从缓存中获取,如果缓存中没