可以使用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
,其中~
是一元运算符。
在这种情况下,我不知道X
,I1
,I2
和UnaryExpression
应该是什么。
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<>();
无法想象这种铸造是否明智的情况。
答案 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
}
}