Skip to content

Instantly share code, notes, and snippets.

@kmizu
Created July 1, 2018 21:07
Show Gist options
  • Save kmizu/1e8276f8dfa1885e8ad918d588554d6a to your computer and use it in GitHub Desktop.
Save kmizu/1e8276f8dfa1885e8ad918d588554d6a to your computer and use it in GitHub Desktop.
Scala's existential type cannot emulate Java's Wildcard
Undecidable.scala:6: error: illegal cyclic reference involving trait E
trait E[X] extends AnyRef with Qlr[N[_ >: Qr[_ >: E[_ >: E[_ >: X]]]]] with Qrl[N[_ >: Ql[_ >: E<_ >: E[_ >: X]]]]
^
Undecidable.scala:6: error: E does not take type parameters
trait E[X] extends AnyRef with Qlr[N[_ >: Qr[_ >: E[_ >: E[_ >: X]]]]] with Qrl[N[_ >: Ql[_ >: E<_ >: E[_ >: X]]]]
^
Undecidable.scala:8: error: illegal cyclic reference involving trait Qr
trait Qr[X] extends AnyRef with L[N[_ >: Qr[_ >: L[_ >: N[_ >: X]]]]] with E[Qrl[_ >: N[_ >: X]]]
^
Undecidable.scala:8: error: E does not take type parameters
trait Qr[X] extends AnyRef with L[N[_ >: Qr[_ >: L[_ >: N[_ >: X]]]]] with E[Qrl[_ >: N[_ >: X]]]
^
Undecidable.scala:6: error: E does not take type parameters
trait E[X] extends AnyRef with Qlr[N[_ >: Qr[_ >: E[_ >: E[_ >: X]]]]] with Qrl[N[_ >: Ql[_ >: E<_ >: E[_ >: X]]]]
^
Undecidable.scala:6: error: not found: type <
trait E[X] extends AnyRef with Qlr[N[_ >: Qr[_ >: E[_ >: E[_ >: X]]]]] with Qrl[N[_ >: Ql[_ >: E<_ >: E[_ >: X]]]]
^
Undecidable.scala:7: error: illegal cyclic reference involving trait Ql
trait Ql[X] extends AnyRef with L[N[_ >: Ql[_ >: L[_ >: N[_ >: X]]]]] with E[Qlr[_ >: N[_ >: X]]]
^
Undecidable.scala:7: error: E does not take type parameters
trait Ql[X] extends AnyRef with L[N[_ >: Ql[_ >: L[_ >: N[_ >: X]]]]] with E[Qlr[_ >: N[_ >: X]]]
^
Undecidable.scala:10: error: type mismatch;
found : Qr[_$21] where type _$21 >: E[_ >: E[_ >: Z]]
required: L[_ >: N[_ >: L[_ >: N[_ >: L[_ >: N[_ >: E[_ >: E[_ >: Z]]]]]]]]
Note: _$21 <: Any, but trait L is invariant in type X.
You may wish to define X as +X instead. (SLS 4.5)
def doIt(v: Qr[_ >: E[_ >: E[_ >: Z]]]): L[_ >: N[_ >: L[_ >: N[_ >: L[_ >: N[_ >: E[_ >: E[_ >: Z]]]]]]]] = v
^
9 errors found
trait Z
trait N[X]
trait L[X]
trait Qlr[X]
trait Qrl[X]
trait E[X] extends AnyRef with Qlr[N[_ >: Qr[_ >: E[_ >: E[_ >: X]]]]] with Qrl[N[_ >: Ql[_ >: E<_ >: E[_ >: X]]]]
trait Ql[X] extends AnyRef with L[N[_ >: Ql[_ >: L[_ >: N[_ >: X]]]]] with E[Qlr[_ >: N[_ >: X]]]
trait Qr[X] extends AnyRef with L[N[_ >: Qr[_ >: L[_ >: N[_ >: X]]]]] with E[Qrl[_ >: N[_ >: X]]]
object Undecidable {
def doIt(v: Qr[_ >: E[_ >: E[_ >: Z]]]): L[_ >: N[_ >: L[_ >: N[_ >: L[_ >: N[_ >: E[_ >: E[_ >: Z]]]]]]]] = v
}
/*
interface Z {} interface N<x> {} interface L<x> {}
interface Qlr<x> {} interface Qrl<x> {}
interface E<x> extends
Qlr<N<?super Qr<?super E<?super E<?super x>>>>>,
Qrl<N<?super Ql<?super E<?super E<?super x>>>>> {}
interface Ql<x> extends
L<N<?super Ql<?super L<?super N<?super x>>>>>,
E<Qlr<?super N<?super x>>> {}
interface Qr<x> extends
L<N<?super Qr<?super L<?super N<?super x>>>>>,
E<Qrl<?super N<?super x>>> {}
class Main {
L<?super N<?super L<?super N<?super L<?super N<?super
E<?super E<?super Z>>>>>>>>
doit(Qr<? super E<? super E<? super Z>>> v) {return v;}
}
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment