在强制转换表达式中使用AdditionalBound

时间:2016-01-10 14:40:14

标签: java casting java-8

可以使用JLS8 cast expression中描述的AdditionalBound来为lambda表达式或方法引用构建之外的任何内容吗?

据说,它可能是:

( ReferenceType {AdditionalBound} ) UnaryExpressionNotPlusMinus 

那:

  

演员阵容引入的投射上下文(第5.5节)的目标类型   表达式是(...)由ReferenceType表示的交集类型   和附加条款术语出现在演员操作员中。

但我找不到使用 -lambda或 -method-reference示例的可行示例,例如:

 X x = (I1&I2) some_UnaryExpressionNotPlusMinus

UPD:

特别是,它允许像

这样的东西

X x = (I1&I2) ~ UnaryExpression,其中~是一元运算符。

在这种情况下,我不知道XI1I2UnaryExpression应该是什么。

UPD-2:感谢@Jimmy T.,他展示了可行的例子

Object x = (Number&Serializable)~0;

但是看到非冗余的例子会很高兴,这种情况很有意义。

UPD-3:根据以上所有这些表达式都已编译,但所有这些表达都没有任何意义:

    Object l1 = (Collection & Iterable) new ArrayList<>();
    List l2 = (ByteList & Iterable) new ArrayList<>();
    Collection l3 = (List & Iterable) new ArrayList<>();

无法想象这种铸造是否明智的情况。

2 个答案:

答案 0 :(得分:4)

这可以编译:

Object x = (Number&Serializable)~0;

这也可以编译:

void method()
{
    method2((Number&Serializable)~0);
}

<T extends Number&Serializable> void method2(T x)
{

}

实际需要演员的例子:

void method(Object o)
{
  method2((List&AutoCloseable)o);
}

<T extends List&AutoCloseable> void method2(T v)
{

}

答案 1 :(得分:-1)

interface A { String msgA = "A interface"; }
interface B { String msgB = "B interface"; }
interface C { String msgC = "C interface"; }
interface ABC extends A,B,C {}

public class MultipleBounds_test {
    public static void main(String[] args) {
       ABC abc = new ABC(){};
       var ab  = (A & B) abc; 

       System.out.println( ab.msgA );
       System.out.println( ab.msgB );
       //System.out.println( ab.msgC );  //error, cannot find symbol: msgC
    }
}