【问题标题】:Strange Java cast syntax using & [duplicate]使用 & [重复] 的奇怪 Java 强制转换语法
【发布时间】:2018-06-27 19:45:57
【问题描述】:

(其实这个问题与 lambdas 没有直接关系,而是与 casts 使用边界有关,所以标记为重复的问题并没有提供这个问题的答案。你会找到答案我的问题在这里:How should I cast for Java generic with multiple bounds?)

就在最近,我参加了一个 SW 工艺会议。在一个讨论的示例中,我遇到了这种类型的转换,它似乎是自 Java 8 以来有效的 Java。

Object aTest = (String & CharSequence) "test";

我的问题:谁能告诉我这背后的成语以及它究竟能为我们做什么?该示例的演示者无法解释它,我也没有找到任何提及(我什至不知道它的名称)。

除了 Oleksandr 的问题之外,我必须在此处添加另一个答案,因为此问题已被标记为重复,因此已被锁定。

与此同时,我能够构建一个(人为的)用例,只是为了让想法清晰。

假设我们有泛型方法foo(),它的唯一参数是泛型的,并且类型参数有两个上限(针对ComparableSerializable):

public static <T extends Comparable & Serializable> void foo(T t) {
    System.out.println(t);
}

进一步假设,我们有一个类AClass,它实现了ComparableSerializable

public class AClass implements Comparable, Serializable {
    @Override
    public int compareTo(Object other) {
        return 0;
    }
}

进一步假设人为部分,我们有一个AClass 对象instance,它被分配给Object 类型的变量:

Object instance = new AClass();

如果在代码的另一处,我们想将instance 传递给foo(),而我们不知道instance 的动态类型(即AClass),我们可以使用特殊的投射语法以在instance 上放置“隐形眼镜”以使通话正常进行:

foo((Comparable & Serializable) instance);

实际上,特长不在于转换语法,而在于如何指定类型。这个类型规范声明了一个所谓的intersection type

【问题讨论】:

  • Java 支持multiple bounds 类型参数。
  • 是的,我从类型边界知道 &,但这里不涉及类型参数。
  • 实际上,这就是这里发生的事情。它大部分对 lambda -&gt; 表示法很有用。
  • Elliott,你能给我举个例子吗?

标签: java casting java-8 type-bounds bounded-types


【解决方案1】:

这是一个cast operator,可以包含一个类型列表:

(ReferenceType {AdditionalBound}) Expression  =>  (String & CharSequence) "test";

其中AdditionalBound定义为:

... & InterfaceType

我大致了解这一点,但是用例呢?

这个question 和答案描述了一个真正的实际用例。例如,要使 lambda 表达式可序列化,您可以编写:

Consumer<String> consumer = (Consumer<String> & Serializable) System.out::println;

(感谢@assylias)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多