Вызов абстрактных классов scala с параметрами и внутренними классами из Java - PullRequest
3 голосов
/ 04 июня 2011

Если я определю класс Scala:

 class X(i:Int) {
   println (i)
 }

Как использовать этот класс в коде Java?

[РЕДАКТИРОВАТЬ] На самом деле, моя проблема немного сложнее

У меня есть абстрактный класс

 abstract class X(i:Int) {
   println (i)
   def hello(s:String):Unit
 }

Мне нужно использовать это в коде Java. Можно ли сделать это легко?

[EDIT2] Рассмотрим следующий код

 object B {
    case class C(i:Int)
 }
 abstract class X(i:Int) {
   println (i)
   def hello(a:B.C):Unit
 }

В этом случае следующий код Java выдает ошибку в IDE Netbeans, но компоновка в порядке:

 public class Y extends X  {
    public void hello(B.C c) {
       System.out.println("here");
    }
    public Y(int i) {
       super(i);
    }
 }

Я получаю ошибку:

hello(B.C) in Y cannot override hello(B.C) in X; overridden method is static, final

NetBeans 6,8, Scala 2,8.

На данный момент я думаю, что единственное решение - игнорировать ошибки NB.

Вот изображение, показывающее точные ошибки, которые я получаю: IDE error using scala code from java

Ответы [ 3 ]

7 голосов
/ 04 июня 2011

Сгенерированный байт-код для вашего класса будет идентичным определению Java:

abstract class X implements scala.ScalaObject {
  public X(int i) {
    System.out.println(i);
  }

  public abstract void hello(String s);

  //possibly other fields/methods mixed-in from ScalaObject
}

Используйте его точно так же, как и для этого эквивалентного Java;подкласс и обеспечить конкретную реализацию метода hello.

3 голосов
/ 04 июня 2011

Вам нужно передать jar библиотеки Scala в путь к классу, чтобы скомпилировать любой код Java, расширяющий класс Scala. Например:

dcs@ayanami:~/tmp$ cat X.scala
abstract class X(i:Int) {
   println (i)
   def hello(s:String):Unit
}

dcs@ayanami:~/tmp$ scalac X.scala
dcs@ayanami:~/tmp$ cat Y.java
public class Y extends X {
    public Y(int i) {
        super(i);
    }

    public void hello(String s) {
        System.out.println("Hello "+s);
    }
}
dcs@ayanami:~/tmp$ javac -cp .:/home/dcs/github/scala/dists/latest/lib/scala-library.jar Y.java
1 голос
/ 04 июня 2011

Вы должны иметь возможность вызывать код Scala из Java (может быть, с каким-то изменением имени и так далее). Что произойдет, если вы попробуете следующее?

X x = new X(23);

В более сложных случаях вы можете использовать javap или аналогичные инструменты, чтобы узнать, как переводился код Scala. Если больше ничего не работает, вы все равно можете написать некоторые вспомогательные методы на стороне Scala, чтобы облегчить доступ со стороны Java (например, когда задействованы импликации).

...