-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Fix generic signature for type params bounded by primitive #16442
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
class Loc(val idx: Int) extends AnyVal | ||
|
||
class Foo: | ||
def testNoParam[A <: Int]: A = 1.asInstanceOf[A] | ||
def testSingleParam[A <: Int](a: A): A = 2.asInstanceOf[A] // <A:Ljava/lang/Object;>(I)I | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Shouldn't we drop the generic signature here entirely? In the end it's just int => int There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think it's a matter of taste a this point. From Java, there's no more link between any passed type argument and the term argument, but maybe there is still a type argument you can provide - so that's why I kept it, as well as it being easier to implement it this way. Unless we have a real reason to drop it, I think this is good. |
||
def testSingleParam2[A <: Int](a: A): Box[A] = new Box[A](a) // <A:Ljava/lang/Object;>(I)LBox<Ljava/lang/Object;>; | ||
def testSingleParam3[A <: Int](box: Box[A]): A = box.value // <A:Ljava/lang/Object;>(LBox<Ljava/lang/Object;>;)I | ||
def testOtherReturn[A <: Int](a: A): String = "3" | ||
def testNoErasure[A <: String](a: A): A = "4".asInstanceOf[A] | ||
def testMultiParam[A <: Int, B <: String](a: A, b: B): A = 5.asInstanceOf[A] | ||
|
||
def testVCNoParam[A <: Loc]: A = Loc(1).asInstanceOf[A] | ||
def testVCSingleParam[A <: Loc](a: A): A = Loc(2).asInstanceOf[A] | ||
def testVCOtherReturn[A <: Loc](a: A): String = "3" | ||
def testVCNoErasure[A <: String](a: A): A = "4".asInstanceOf[A] | ||
def testVCMultiParam[A <: Loc, B <: String](a: A, b: B): A = Loc(5).asInstanceOf[A] | ||
|
||
class Box[T](val value: T) | ||
|
||
class BarParent[X, Y] | ||
trait BarInterface[F, G] | ||
abstract class Bar[A <: Int](a: A) extends BarParent[A, String] with BarInterface[Int, A]: | ||
def getMap: Map[String, A] | ||
def bar[B](a: A, b: B): (A, B, Int) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
public class Test { | ||
public static void main(String[] args) throws Exception { | ||
Foo foo = new Foo(); | ||
System.out.println(foo.testNoParam()); | ||
System.out.println(foo.testSingleParam(2)); | ||
System.out.println(foo.testSingleParam2(21).value()); | ||
System.out.println(foo.testSingleParam3(new Box(22))); | ||
System.out.println(foo.testOtherReturn(3)); | ||
System.out.println(foo.testNoErasure("4")); | ||
System.out.println(foo.testMultiParam(5, "5")); | ||
|
||
System.out.println(foo.testVCNoParam()); | ||
System.out.println(foo.testVCSingleParam(2)); | ||
System.out.println(foo.testVCOtherReturn(3)); | ||
System.out.println(foo.testVCNoErasure("4")); | ||
System.out.println(foo.testVCMultiParam(5, "5")); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Imports w.r.t. debugging can be dropped
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd love to never have to import them, so this is 1 more file that won't have to happen...