Use "Any?" as out-type for type parameters instead of intersection of bounds

Also refactor checkSubtypeForTheSameConstructor to compute everything in the
best order
This commit is contained in:
Alexander Udalov
2015-10-22 23:26:37 +03:00
parent bed75e8af2
commit 12d6b6e7e4
4 changed files with 93 additions and 20 deletions
@@ -0,0 +1,18 @@
import java.io.Serializable
class A<T> where T : Cloneable, T : Serializable
interface CS1 : Cloneable, Serializable
interface CS2 : CS1
interface I1 {
fun foo(): A<in CS2>
}
interface I2 : I1 {
override fun foo(): A<CS1>
}
interface I3 : I1 {
override fun foo(): A<in CS1>
}
@@ -0,0 +1,43 @@
package
public final class A</*0*/ T : kotlin.Cloneable> where T : java.io.Serializable {
public constructor A</*0*/ T : kotlin.Cloneable>() where T : java.io.Serializable
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface CS1 : kotlin.Cloneable, java.io.Serializable {
protected open override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface CS2 : CS1 {
protected open override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface I1 {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun foo(): A<in CS2>
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface I2 : I1 {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract override /*1*/ fun foo(): A<CS1>
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface I3 : I1 {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract override /*1*/ fun foo(): A<in CS1>
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}