Approximate projections in SAM type when creating SAM adapter
Use the same approach as Java 8 applies to function types (see non-wildcard parametrization in §9.9 of JLS) #KT-6918 Fixed
This commit is contained in:
+52
@@ -0,0 +1,52 @@
|
||||
// !CHECK_TYPE
|
||||
// FILE: EventListener.java
|
||||
public interface EventListener<E> {
|
||||
E handle(String x);
|
||||
}
|
||||
|
||||
// FILE: A.java
|
||||
public class A {
|
||||
public void foo(EventListener<?> l) {
|
||||
}
|
||||
|
||||
public static void bar(EventListener<?> l) {
|
||||
}
|
||||
|
||||
public static void baz(EventListener<? extends CharSequence> l) {
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun main() {
|
||||
A().foo {
|
||||
x -> 1
|
||||
}
|
||||
|
||||
A.bar {
|
||||
x -> 1
|
||||
}
|
||||
|
||||
|
||||
// baz
|
||||
A.baz {
|
||||
x -> "" // OK
|
||||
}
|
||||
|
||||
A.baz {
|
||||
x -> <!CONSTANT_EXPECTED_TYPE_MISMATCH!>1<!>
|
||||
}
|
||||
|
||||
val block: (String) -> Any? = {
|
||||
x -> 1
|
||||
}
|
||||
|
||||
A().foo(block)
|
||||
A.bar(block)
|
||||
|
||||
val block2: (String) -> CharSequence? = {
|
||||
x -> ""
|
||||
}
|
||||
|
||||
A.<!NONE_APPLICABLE!>baz<!>(block)
|
||||
A.baz(block2)
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
package
|
||||
|
||||
public /*synthesized*/ fun </*0*/ E : kotlin.Any!> EventListener(/*0*/ function: (kotlin.String!) -> E!): EventListener<E>
|
||||
public fun main(): kotlin.Unit
|
||||
|
||||
public open class A {
|
||||
public constructor A()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ l: EventListener<*>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public final /*synthesized*/ fun bar(/*0*/ l: ((kotlin.String!) -> kotlin.Any!)!): kotlin.Unit
|
||||
public open fun bar(/*0*/ l: EventListener<*>!): kotlin.Unit
|
||||
public final /*synthesized*/ fun baz(/*0*/ l: ((kotlin.String!) -> kotlin.CharSequence!)!): kotlin.Unit
|
||||
public open fun baz(/*0*/ l: EventListener<out kotlin.CharSequence!>!): kotlin.Unit
|
||||
}
|
||||
|
||||
public interface EventListener</*0*/ E : kotlin.Any!> {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public abstract fun handle(/*0*/ x: kotlin.String!): E!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
// !CHECK_TYPE
|
||||
// FILE: EventListener.java
|
||||
public interface EventListener<E> {
|
||||
void handle(E e);
|
||||
}
|
||||
|
||||
// FILE: A.java
|
||||
public class A {
|
||||
public void foo(EventListener<?> l) {
|
||||
}
|
||||
|
||||
public static void bar(EventListener<?> l) {
|
||||
}
|
||||
|
||||
public static void baz(EventListener<? extends CharSequence> l) {
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun main() {
|
||||
A().foo {
|
||||
x -> x checkType { _<Any?>() }
|
||||
}
|
||||
|
||||
A.bar {
|
||||
x -> x checkType { _<Any?>() }
|
||||
}
|
||||
|
||||
A.baz {
|
||||
x -> x checkType { _<CharSequence?>() }
|
||||
}
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
package
|
||||
|
||||
public /*synthesized*/ fun </*0*/ E : kotlin.Any!> EventListener(/*0*/ function: (E!) -> kotlin.Unit): EventListener<E>
|
||||
public fun main(): kotlin.Unit
|
||||
|
||||
public open class A {
|
||||
public constructor A()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ l: EventListener<*>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public final /*synthesized*/ fun bar(/*0*/ l: ((kotlin.Any!) -> kotlin.Unit)!): kotlin.Unit
|
||||
public open fun bar(/*0*/ l: EventListener<*>!): kotlin.Unit
|
||||
public final /*synthesized*/ fun baz(/*0*/ l: ((kotlin.CharSequence!) -> kotlin.Unit)!): kotlin.Unit
|
||||
public open fun baz(/*0*/ l: EventListener<out kotlin.CharSequence!>!): kotlin.Unit
|
||||
}
|
||||
|
||||
public interface EventListener</*0*/ E : kotlin.Any!> {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public abstract fun handle(/*0*/ e: E!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
// !CHECK_TYPE
|
||||
// FILE: EventListener.java
|
||||
public interface EventListener<E> {
|
||||
void handle(E e);
|
||||
}
|
||||
|
||||
// FILE: A.java
|
||||
public class A {
|
||||
public void foo(EventListener<? super CharSequence> l) {
|
||||
}
|
||||
|
||||
public static void bar(EventListener<? super String> l) {
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun main() {
|
||||
A().foo {
|
||||
x -> x checkType { _<CharSequence?>() }
|
||||
}
|
||||
|
||||
A.bar {
|
||||
x -> x checkType { _<String>() }
|
||||
}
|
||||
}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
package
|
||||
|
||||
public /*synthesized*/ fun </*0*/ E : kotlin.Any!> EventListener(/*0*/ function: (E!) -> kotlin.Unit): EventListener<E>
|
||||
public fun main(): kotlin.Unit
|
||||
|
||||
public open class A {
|
||||
public constructor A()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ l: EventListener<in kotlin.CharSequence!>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public final /*synthesized*/ fun bar(/*0*/ l: ((kotlin.String!) -> kotlin.Unit)!): kotlin.Unit
|
||||
public open fun bar(/*0*/ l: EventListener<in kotlin.String!>!): kotlin.Unit
|
||||
}
|
||||
|
||||
public interface EventListener</*0*/ E : kotlin.Any!> {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public abstract fun handle(/*0*/ e: E!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
Vendored
+27
@@ -0,0 +1,27 @@
|
||||
// !CHECK_TYPE
|
||||
// FILE: Function.java
|
||||
public interface Function<E extends CharSequence, F extends java.util.Map<String, E>> {
|
||||
E handle(F f);
|
||||
}
|
||||
|
||||
// FILE: A.java
|
||||
public class A {
|
||||
public void foo(Function<?, ?> l) {
|
||||
}
|
||||
|
||||
public static void bar(Function<?, ?> l) {
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun main() {
|
||||
A().foo <!TYPE_MISMATCH!>{
|
||||
<!CANNOT_INFER_PARAMETER_TYPE!>x<!> ->
|
||||
""
|
||||
}<!>
|
||||
|
||||
A.bar <!TYPE_MISMATCH!>{
|
||||
<!CANNOT_INFER_PARAMETER_TYPE!>x<!> ->
|
||||
""
|
||||
}<!>
|
||||
}
|
||||
compiler/testData/diagnostics/tests/j+k/samByProjectedType/noAdapterBecuaseOfRecursiveUpperBound.txt
Vendored
+22
@@ -0,0 +1,22 @@
|
||||
package
|
||||
|
||||
public /*synthesized*/ fun </*0*/ E : kotlin.CharSequence!, /*1*/ F : kotlin.collections.(Mutable)Map<kotlin.String!, E!>!> Function(/*0*/ function: (F!) -> E!): Function<E, F>
|
||||
public fun main(): kotlin.Unit
|
||||
|
||||
public open class A {
|
||||
public constructor A()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ l: Function<*, *>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public open fun bar(/*0*/ l: Function<*, *>!): kotlin.Unit
|
||||
}
|
||||
|
||||
public interface Function</*0*/ E : kotlin.CharSequence!, /*1*/ F : kotlin.collections.(Mutable)Map<kotlin.String!, E!>!> {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public abstract fun handle(/*0*/ f: F!): E!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
Vendored
+33
@@ -0,0 +1,33 @@
|
||||
// !CHECK_TYPE
|
||||
// FILE: Function.java
|
||||
public interface Function<E extends java.util.Map<String, Integer>, F extends CharSequence> {
|
||||
F handle(E e);
|
||||
}
|
||||
|
||||
// FILE: A.java
|
||||
public class A {
|
||||
public void foo(Function<?, ?> l) {
|
||||
}
|
||||
|
||||
public static void bar(Function<?, ?> l) {
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun main() {
|
||||
A().foo {
|
||||
x ->
|
||||
x checkType { _<Map<String, Int>?>() }
|
||||
""
|
||||
}
|
||||
|
||||
A.bar {
|
||||
x ->
|
||||
x checkType { _<Map<String, Int>>() }
|
||||
""
|
||||
}
|
||||
|
||||
val block: (Map<String, Int>) -> CharSequence = { x -> "" }
|
||||
A().foo(block)
|
||||
A.bar(block)
|
||||
}
|
||||
Vendored
+23
@@ -0,0 +1,23 @@
|
||||
package
|
||||
|
||||
public /*synthesized*/ fun </*0*/ E : kotlin.collections.(Mutable)Map<kotlin.String!, kotlin.Int!>!, /*1*/ F : kotlin.CharSequence!> Function(/*0*/ function: (E!) -> F!): Function<E, F>
|
||||
public fun main(): kotlin.Unit
|
||||
|
||||
public open class A {
|
||||
public constructor A()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ l: Function<*, *>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public final /*synthesized*/ fun bar(/*0*/ l: ((kotlin.collections.(Mutable)Map<kotlin.String!, kotlin.Int!>!) -> kotlin.CharSequence!)!): kotlin.Unit
|
||||
public open fun bar(/*0*/ l: Function<*, *>!): kotlin.Unit
|
||||
}
|
||||
|
||||
public interface Function</*0*/ E : kotlin.collections.(Mutable)Map<kotlin.String!, kotlin.Int!>!, /*1*/ F : kotlin.CharSequence!> {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public abstract fun handle(/*0*/ e: E!): F!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
Reference in New Issue
Block a user