任何人都可以描述这种代码来理解Java封闭.
public static <T> void sort(List<T> l, final {T, T=>Number} block) {
Collections.sort(l, new Comparator<T>() {
public int compare(T arg0, T arg1) {
return block.invoke(arg0, arg1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
aio*_*obe 30
重要提示:问题是关于早先的提案.这不是选择的语法.将此Q/A视为"历史参考".
这种语法在Gilad Bracha,Neal Gafter,James Gosling和Peter vonderAhé 的BGGA提案中有所描述.
这段代码可以描述如下:
它接受一个函数获取参数(T, T)并返回Number(并将其赋值给参数block)作为第二个参数
然后它创建一个Comparator<T>它.这是通过将其compare委托给调用来实现该方法block.
将此比较器传递给该Collections.sort方法.
这是一个细分语法:
public static <T> void sort(List<T> l, final {T, T=>Number} block) {
^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
称为自变量block是类型的"功能,需要两个T并返回一个Number".
Collections.sort(l, new Comparator<T>() {
public int compare(T arg0, T arg1) {
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
Collections.sort使用匿名子类的实例Comparator作为第二个参数的普通调用...
...
return block.invoke(arg0, arg1);
...
Run Code Online (Sandbox Code Playgroud)
...返回由block参数定义的函数计算的数字.
就经典Java而言,你的代码片段会对应于类似的东西
interface Block<T> {
public int invoke(T arg1, T arg2);
}
class Test {
public static <T> void sort(List<T> l, final Block<T> block) {
Collections.sort(l, new Comparator<T>() {
public int compare(T arg0, T arg1) {
return block.invoke(arg0, arg1);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1199 次 |
| 最近记录: |