方块操作符 ( <> ) 在 Java 7 中就引入了,目的是为了使代码更可读。
但是呢,这个操作符一直不能在匿名内部类中使用
Java 9 修正了这个问题,就是可以在匿名内部类中使用方块操作符了,在匿名类大行其道的今天,这才叫优化了阅读体验...
我们来看看一段 Java 9 之前的代码
DiamondOperatorTester.java
[Java]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
public
class
DiamondOperatorTester {
public
static
void
main(String[] args) {
Handler<Integer> intHandler =
new
Handler<Integer>(
1
) {
@Override
public
void
handle() {
System.out.println(content);
}
};
intHandler.handle();
Handler<?
extends
Number> intHandler1 =
new
Handler<Number>(
2
) {
@Override
public
void
handle() {
System.out.println(content);
}
};
intHandler1.handle();
Handler<?> handler =
new
Handler<Object>(
"test"
) {
@Override
public
void
handle() {
System.out.println(content);
}
};
handler.handle();
}
}
abstract
class
Handler<T> {
public
T content;
public
Handler(T content) {
this
.content = content;
}
abstract
void
handle();
}
|
运行结果如下
[Java]
纯文本查看
复制代码
1
2
3
4
|
[[email]yufei
@www
.twle.cn[/email] java9]$ javac DiamondOperatorTester.java && java DiamondOperatorTester
1
2
test
|
不知道你是否看出来了,对于下面这两条语句
[Java]
纯文本查看
复制代码
1
2
3
|
Handler<?
extends
Number> intHandler1 =
new
Handler<Number>(
2
)
Handler<?> handler =
new
Handler<Object>(
"test"
)
|
后面的匿名类中的那个 <Number> 和 Handler<Object> 中的尖括号的类型是可以推导出来的。
因为 Java 是强类型语言,所以,对于匿名内部类来说,赋值的变量类型其实就是内部类的变量类型
如果使用了推导,就可以改成下面这样
[Java]
纯文本查看
复制代码
1
2
3
|
Handler<?
extends
Number> intHandler1 =
new
Handler<>(
2
)
Handler<?> handler =
new
Handler<>(
"test"
)
|
可读性是不是增强了,这样大家一眼就看出了匿名类的类型是它们赋值变量的类型
Java 9 也是这么做的,方块操作符 <> 的作用就是这个
因此,我们在 Java 9 以上的版本中,可以将范例改成下面这种方式
[Java]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
public
class
DiamondOperatorTester {
public
static
void
main(String[] args) {
Handler<Integer> intHandler =
new
Handler<>(
1
) {
@Override
public
void
handle() {
System.out.println(content);
}
};
intHandler.handle();
Handler<?
extends
Number> intHandler1 =
new
Handler<>(
2
) {
@Override
public
void
handle() {
System.out.println(content);
}
};
intHandler1.handle();
Handler<?> handler =
new
Handler<>(
"test"
) {
@Override
public
void
handle() {
System.out.println(content);
}
};
handler.handle();
}
}
abstract
class
Handler<T> {
public
T content;
public
Handler(T content) {
this
.content = content;
}
abstract
void
handle();
}
|
运行结果也是一样的
[Java]
纯文本查看
复制代码
1
2
3
4
|
[[email]yufei
@www
.twle.cn[/email] java9]$ javac DiamondOperatorTester.java && java DiamondOperatorTester
1
2
test
|
|