2013-08-03 13 views
5

ich in diesem Beispiel Problem verstehen Scalac die Fehlermeldung habe:Java generische Methode von Scala mit

Bean.java

public class Bean { 
    static public class Attribute<T> { 
    public final String name; 
    public Attribute(String name) {this.name = name;} 
    // equals and hashcode omitted for simplicity 
    } 

    public <T> void set(Attribute<T> attribute, T value) {} 

    public static Attribute<Long> AGE = new Attribute<Long>("age"); 
} 

Test.scala

object Test { 
    def test() { 
    val bean = new Bean(); 
    bean.set(Bean.AGE, 2L); 
    } 
} 

Kompilierung yilds dies (mit scalac 2.9.2 versucht):

Test.scala:4: error: type mismatch; 
found : Bean.Attribute[java.lang.Long] 
required: Bean.Attribute[Any] 
Note: java.lang.Long <: Any, but Java-defined class Attribute is invariant in type T. 
You may wish to investigate a wildcard type such as `_ <: Any`. (SLS 3.2.10) 
bean.set(Bean.AGE, 2L); 
      ^
one error found 

Warum benötigt es Attribut [Any]? Doing gleiche in Java funktioniert

dank

Antwort

7

Der Fehler beruht Long zwischen java.lang.Long und scala zu stimmen nicht überein.

Bean.AGE ist vom Typ Bean.Attribute[java.lang.Long]. Daher erwartet der Scala-Compiler ein java.lang.Long als das andere Argument. Aber Sie übergeben ist 2L, die scala.Long ist und nicht java.lang.Long. Daher zeigt es Fehler.

Dadurch wird wie erwartet:

b.set(Bean.AGE,new java.lang.Long(23)) 

Dank @senia, das ist eine bessere Alternative:

bean.set[java.lang.Long](Bean.AGE, 23) 
bean.set(Bean.AGE, 23:java.lang.Long) 
+0

java.util.Long? Tippfehler –

+0

@PrinceJohnWesley Ups. Ja. Korrigiert. Vielen Dank. – Jatin

+3

Glaubst du nicht, dass '23: java.lang.Long' ein bisschen besser aussieht? Oder sogar 'b.set [java.lang.Long] (Bean.AGE, 23)'. – senia

Verwandte Themen