Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Type aliasing Java classes with statics

Tags:

scala

Suppose MyClass is a class defined in Java, and has many static as well as non-static members. I tried to alias this class (and associated companion object) in a Scala object MyObject as shown below:

object MyObject {
  import javastuff._
  type MyAlias = MyClass
  val MyAlias = MyClass
}

Scalac complains:

error: object MyClass is not a value
val MyAlias = MyClass

How do I work around this? Thanks.

like image 902
Siddharth Raina Avatar asked Feb 09 '11 09:02

Siddharth Raina


2 Answers

Although this works in pure Scala for a class + companion object, it's not possible with Java's static methods, as these don't belong to any interface.

Scala could, in theory, create an object containing delegates to all the static methods of some class, but it doesn't do this currently. It's also possible to write a compiler plugin for this if you feel comfortable writing plugins.

Failing that, you'll either have to create an object full of delegates yourself, or just cherry-pick a few methods and pass them around as functions.

like image 96
Kevin Wright Avatar answered Nov 16 '22 16:11

Kevin Wright


it's not possible with Java's static methods, as these don't belong to any interface.

Update 5 years later: PR 5131 mentions:

We used to disable generation of static forwarders when a object had a trait as a companion, as one could not add methods with bodies to an interface in JVM 6.

The JVM lifted this restriction to support default methods in interfaces, so we can lift the restriction on static forwarders, too.

Fixes scala-dev issue 59

See commit 41c9a17 by Jason Zaugg (retronym).

like image 1
VonC Avatar answered Nov 16 '22 16:11

VonC