2012-04-05 6 views
0

ich ein Projekt erstellt haben, die scala verwendet, die einige abstrakte Klassen Definitionen, zB:Integration von Java mit Scala: Erweiterung von Scala Klassen

abstract class A(n: String) { 
    require(n!= null) 
    val name = n 

    var inputs: List[Input[_]] 
    var outputs: List[Output[_]] 
} 

abstract class B(n: String) extends A(n){ 
    def act 
    def isValid : Boolean 
    def getCs : List[C[_]] 
} 

abstract class C[Type]{ 
    var value: Type 
} 

Jetzt möchte ich das Projekt in Java verwenden. Ich habe scala lib in einem neuen Projekt importiert und scala-Projekt im Build-Pfad hinzugefügt. Ich benutze Eclipse.

aber wenn ich versuche, dies zu tun:

public class CoolClass extends B { 
    public CoolClass(){ } 
} 

EDIT:

Ich habe einige Probleme dies in Java verwenden, die mir einige Zweifel erhaben. Lassen Sie mich sie aufzählen:

  1. Kann ich Listen von Scala oder das gibt Fehler in Java?
  2. Warum Vars von A nicht in Klassen erkannt werden, die B in Java erweitern?
  3. Wie kann ich getCs erklären, so dass es eine Schnittstelle mit List<C> statt List<C<?>> bietet?

Antwort

6

Ich nehme nur an, dass Sie alle Methoden implementiert haben, die Sie in Ihrem class B auch in Ihrem Java class CoolClass definieren. Was hier fehlt ist der Aufruf an B 's Konstruktor, wie die Fehlermeldung sagt.

class CoolClass extends B { 
    public CoolClass() { 
    super(""); 
    } 
    // methods implementations 
} 

Es gibt keine Standard-Konstruktor definiert auf Ihrem class B, so müssen Sie explizit die man nennen, die definiert ist, die B(n: String) ist.

edit:

1: Sie können alles, was Sie auf beiden Seiten wollen. Obwohl die Methodennamen in einigen speziellen Fällen unterschiedlich sein können, wie etwa bei allen, die spezielle Zeichen in scala enthalten.

2: Sie werden erkannt, obwohl sie keine Felder sind, aber Methoden im Java-Code. Sie können auf sie zugreifen mit this.inputs() und this.outputs()

3: def getCs[C]: List[C]

+0

Der Konstrukteur löste einige Probleme, aber ich bekomme immer wieder Probleme und viele davon ergeben keinen Sinn. Ich bleibe bei einem Zweifel: Kann ich Listen (von Scala) verwenden? Oder Java mag das nicht? –

+0

Klasse A hat 2 Variablen, die eine Liste als Typ haben, und Java kann diese Variablen nicht als Felder der Klasse A erkennen. –

+0

Ist der Code, den Sie gepostet haben, der Code, mit dem Sie Probleme haben? Deine 'def getCs: Liste [C [_]]' kompiliert nicht, weil 'C' nicht bekannt ist.Du sprichst von 2 Feldern in der A-Klasse, könntest du bitte deinen ursprünglichen Beitrag entsprechend bearbeiten? – drexin

1

Ihre B-Klasse Versuchen ist im Wesentlichen, wie Sie beschreiben:

public abstract class B extends A { 
    public B(String n) { 
    super(n); 
    } 

    public abstract void act() 
    public abstract boolean isValid(); 
    public abstract List<C<?>> getCs(); 
} 

Ihre CoolClass die explizite Super Aufruf im Konstruktor fehlt:

public CoolClass extends B { 
    public CoolClass() { // override ctor with no string parameter 
    super("defaultStringValue"); 
    } 

    public CoolClass(String n) { // override ctor with no string parameter 
    super(n); 
    } 
    … 

Wie Sie sehen können Scala macht es so trivial Konstruktoren zu deklarieren und rufen wir vergessen, wie viel Boilerplate fügen sie in Java hinzu.