8191655: LambdaConversionException: Invalid receiver type interface; not a subtype of implementation type interface
Reviewed-by: mcimadamore
This commit is contained in:
parent
f944ef6ebc
commit
14e7d88c9e
@ -2269,17 +2269,22 @@ public class LambdaToMethod extends TreeTranslator {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Erasure destroys the implementation parameter subtype
|
* Erasure destroys the implementation parameter subtype
|
||||||
* relationship for intersection types
|
* relationship for intersection types.
|
||||||
|
* Have similar problems for union types too.
|
||||||
*/
|
*/
|
||||||
boolean interfaceParameterIsIntersectionType() {
|
boolean interfaceParameterIsIntersectionOrUnionType() {
|
||||||
List<Type> tl = tree.getDescriptorType(types).getParameterTypes();
|
List<Type> tl = tree.getDescriptorType(types).getParameterTypes();
|
||||||
for (; tl.nonEmpty(); tl = tl.tail) {
|
for (; tl.nonEmpty(); tl = tl.tail) {
|
||||||
Type pt = tl.head;
|
Type pt = tl.head;
|
||||||
if (pt.getKind() == TypeKind.TYPEVAR) {
|
switch (pt.getKind()) {
|
||||||
TypeVar tv = (TypeVar) pt;
|
case INTERSECTION:
|
||||||
if (tv.bound.getKind() == TypeKind.INTERSECTION) {
|
case UNION:
|
||||||
return true;
|
return true;
|
||||||
}
|
case TYPEVAR:
|
||||||
|
TypeVar tv = (TypeVar) pt;
|
||||||
|
if (tv.bound.getKind() == TypeKind.INTERSECTION) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -2290,7 +2295,7 @@ public class LambdaToMethod extends TreeTranslator {
|
|||||||
* (i.e. var args need to be expanded or "super" is used)
|
* (i.e. var args need to be expanded or "super" is used)
|
||||||
*/
|
*/
|
||||||
final boolean needsConversionToLambda() {
|
final boolean needsConversionToLambda() {
|
||||||
return interfaceParameterIsIntersectionType() ||
|
return interfaceParameterIsIntersectionOrUnionType() ||
|
||||||
isSuper ||
|
isSuper ||
|
||||||
needsVarArgsConversion() ||
|
needsVarArgsConversion() ||
|
||||||
isArrayOp() ||
|
isArrayOp() ||
|
||||||
|
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @test
|
||||||
|
* @bug 8191655
|
||||||
|
* @summary LambdaConversionException: Invalid receiver type interface; not a subtype of implementation type interface
|
||||||
|
* @run main MethodReferenceIntersectionInducedTest
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
public class MethodReferenceIntersectionInducedTest {
|
||||||
|
static String blah;
|
||||||
|
<T> void forAll(Consumer<T> consumer, T... values) { consumer.accept(values[0]); }
|
||||||
|
|
||||||
|
public void secondTest() {
|
||||||
|
forAll(Picture::draw, new MyPicture(), new Universal());
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Shape { void draw(); }
|
||||||
|
interface Marker { }
|
||||||
|
interface Picture { void draw(); }
|
||||||
|
|
||||||
|
class MyShape implements Marker, Shape { public void draw() { } }
|
||||||
|
class MyPicture implements Marker, Picture { public void draw() { blah = "MyPicture"; } }
|
||||||
|
class Universal implements Marker, Picture, Shape { public void draw() { System.out.println("Universal"); } }
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
new MethodReferenceIntersectionInducedTest().secondTest();
|
||||||
|
if (!blah.equals("MyPicture"))
|
||||||
|
throw new AssertionError("Incorrect output");
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @test
|
||||||
|
* @bug 8191655
|
||||||
|
* @summary LambdaConversionException: Invalid receiver type interface; not a subtype of implementation type interface
|
||||||
|
* @run main MethodReferenceUnionTypeTest
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
public class MethodReferenceUnionTypeTest {
|
||||||
|
static String blah = "NONE";
|
||||||
|
<T> void forAll(Consumer<T> consumer, T value) { consumer.accept(value); }
|
||||||
|
|
||||||
|
public void secondTest() {
|
||||||
|
try {
|
||||||
|
throwing();
|
||||||
|
} catch (A | B ex) {
|
||||||
|
forAll(Picture::draw, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void throwing() throws A, B { throw new A();}
|
||||||
|
|
||||||
|
interface Shape { void draw(); }
|
||||||
|
interface Marker { }
|
||||||
|
interface Picture { void draw(); }
|
||||||
|
|
||||||
|
class A extends Exception implements Marker, Picture { public void draw() { blah = "A"; }}
|
||||||
|
class B extends Exception implements Marker, Picture, Shape { public void draw() {}}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
new MethodReferenceUnionTypeTest().secondTest();
|
||||||
|
if (!blah.equals("A"))
|
||||||
|
throw new AssertionError("Incorrect output");
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user