2013-08-03 4 views
5

У меня проблема понимания сообщение об ошибке Scalac в этом примере:с использованием Java-шаблонный метод от Scala

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); 
    } 
} 

компилируя эти данные (проверено с помощью скаляра 2.9.2):

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 

Зачем нужен атрибут [Любой]? Ведение же в Java работает отлично

благодаря

ответ

7

ошибка происходит из-за несоответствия между java.lang.Long и Long лестницу.

Bean.AGE имеет тип Bean.Attribute[java.lang.Long]. Следовательно, компилятор scala ожидает в качестве другого аргумента java.lang.Long. Но вы проезжаете 2L, что составляет scala.Long, а не java.lang.Long. Следовательно, он показывает ошибку.

Делать это будет работать, как ожидалось:

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

Благодаря @senia, ниже является лучшей альтернативой:

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

java.util.Long? typo –

+0

@PrinceJohnWesley Упс. Да. Исправленный. Благодарю. – Jatin

+3

Не думаете ли вы, что '23: java.lang.Long' выглядит немного лучше? Или даже 'b.set [java.lang.Long] (Bean.AGE, 23)'. – senia