Nic*_*ico 6 java casting bounded-types type-bounds java-8
(实际上,这个问题与lambdas没有直接关系,但是对于使用边界的强制转换,所以标记为重复的问题并没有提供这个问题的答案.你会在这里找到我的问题的答案:我应该如何为Java转换具有多个边界的泛型?)
就在最近,我参加了SW工艺会议.在其中一个讨论的例子中,我遇到了一些这样的演员,它似乎是自Java 8以来的有效Java.
Object aTest = (String & CharSequence) "test";
Run Code Online (Sandbox Code Playgroud)
我的问题:有人可以告诉我这背后的成语以及它究竟能为我们做些什么吗?该示例的演示者无法解释它,我没有找到任何提及(我甚至不知道它的名称).
除了Oleksandr之外,我还要在这里提出另一个答案,因为这个问题已被标记为重复,因此被锁定.
与此同时,我能够构建一个(人为的)用例,只是为了明确这个想法.
假设我们有泛型方法foo(),它的唯一参数是通用的,而type参数有两个上限(反对Comparable和Serializable):
public static <T extends Comparable & Serializable> void foo(T t) {
System.out.println(t);
}
Run Code Online (Sandbox Code Playgroud)
进一步假设,我们有一个类AClass,实现Comparable和Serializable
public class AClass implements Comparable, Serializable {
@Override
public int compareTo(Object other) {
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
进一步假设设计的部分,我们有一个AClass对象instance,它被分配给一个类型的变量Object:
Object instance = new AClass();
Run Code Online (Sandbox Code Playgroud)
如果,在代码的另一个地方,我们想要传递instance给foo(),并且我们不知道动态类型instance(是AClass),我们可以使用特殊的强制语法来放置"隐形眼镜" instance以使呼叫工作:
foo((Comparable & Serializable) instance);
Run Code Online (Sandbox Code Playgroud)
它是一个强制转换运算符,可以包含类型列表:
(ReferenceType {AdditionalBound}) Expression => (String & CharSequence) "test";
Run Code Online (Sandbox Code Playgroud)
其中AdditionalBound定义为:
... & InterfaceType
Run Code Online (Sandbox Code Playgroud)
我一般都理解这一点,但是用例呢?
这个问题和答案描述了一个真实的实际用例。例如,要使 lambda 表达式可序列化,您可以编写:
Consumer<String> consumer = (Consumer<String> & Serializable) System.out::println;
Run Code Online (Sandbox Code Playgroud)
(感谢@assylias)
| 归档时间: |
|
| 查看次数: |
318 次 |
| 最近记录: |