Java 在强制转换表达式中使用AdditionalBound
JLS8中描述的Java 在强制转换表达式中使用AdditionalBound,java,casting,java-8,Java,Casting,Java 8,JLS8中描述的AdditionalBound是否可用于转换除lambda表达式或方法引用之外的任何 据说,它可能是: ( ReferenceType {AdditionalBound} ) UnaryExpressionNotPlusMinus 而且: 由强制转换引入的强制转换上下文(§5.5)的目标类型 表达式是由ReferenceType表示的交集类型(…) 以及cast运算符中出现的附加绑定项 但是我没有找到一个可用的例子,比如非-lambda或非-method参考例子,比如: X
AdditionalBound
是否可用于转换除lambda表达式或方法引用之外的任何
据说,它可能是:
( ReferenceType {AdditionalBound} ) UnaryExpressionNotPlusMinus
而且:
由强制转换引入的强制转换上下文(§5.5)的目标类型
表达式是由ReferenceType表示的交集类型(…)
以及cast运算符中出现的附加绑定项
但是我没有找到一个可用的例子,比如非-lambda或非-method参考例子,比如:
X x = (I1&I2) some_UnaryExpressionNotPlusMinus
UPD:
特别是,它允许
X=(I1&I2)~UnaryExpression
,其中~
是一元运算符
我不知道在这种情况下,X
、I1
、I2
和UnaryExpression
应该是什么
UPD-2:多亏了@Jimmy T,他展示了一个可行的
objectx=(数字&可序列化)~0代码>
但如果能看到一个非冗余的示例,这样的转换就很有意义了
UPD-3:根据以上所有表达式都已编译的事实,但它们都没有任何意义:
Object l1 = (Collection & Iterable) new ArrayList<>();
List l2 = (ByteList & Iterable) new ArrayList<>();
Collection l3 = (List & Iterable) new ArrayList<>();
objectl1=(Collection&Iterable)新建ArrayList();
列表l2=(ByteList&Iterable)新ArrayList();
集合l3=(列表和Iterable)新ArrayList();
我无法想象这样的铸造会是明智的。这可以编译成:
Object x = (Number&Serializable)~0;
void method()
{
method2((Number&Serializable)~0);
}
<T extends Number&Serializable> void method2(T x)
{
}
这也可以编译为:
Object x = (Number&Serializable)~0;
void method()
{
method2((Number&Serializable)~0);
}
<T extends Number&Serializable> void method2(T x)
{
}
void方法()
{
方法2((编号和可序列化)~0);
}
无效方法2(T x)
{
}
实际需要强制转换的示例:
void method(Object o)
{
method2((List&AutoCloseable)o);
}
<T extends List&AutoCloseable> void method2(T v)
{
}
void方法(对象o)
{
方法2((列表和自动关闭)o);
}
无效方法2(T v)
{
}
Cool,+1。但是这个类转换用例是多余的,有什么想法可以解释吗?当调用方法时,转换更有意义。只有在不使用一元运算符的情况下才有意义,因为其他情况下,某些_UnaryExpressionNotPlusMinus的类型是由最终包装类表示的原语。不完全如此,示例Collection l3=(List&Iterable)new ArrayList()代码>,但它也是senselessIt,如果您在方法调用中使用它,它是有意义的(我添加了一个示例)