2013-04-08 8 views
6

Проблема связана с интеграцией между Java и Scala. Я немного упростил это, чтобы сделать вещи более ясными.не может неявно использовать A [T] для AT, где A [T] расширяет AT

Я два класса написаны на Java:

class A<T>{} 

class AT extends A<Boolean> {} 

В Java У меня есть метод, который использует классы следующим образом:

public A<Boolean> a(){ 
    return new AT(); 
} 

Я хотел бы сделать то же самое в Скала. Но приведенный ниже код не компилируется.

def a(): A[Boolean] = { 
    return new AT(); 
} 

В сообщении говорится: "несоответствие типов, найдено: org.rarry.sample.AT требуется: org.rarry.sample.A [Boolean]"

Может кто-нибудь объяснить, почему это так, и как это сделать?

ответ

5

Чтобы понять причину, по которой ваш код не компилируется, обратите внимание на то, что Java использует java.lang.Boolean для буферизованного типа с буфером, а Scala использует scala.Boolean. В большинстве случаев, когда вы хотите использовать один из них, а метод возвращает другой (или аргумент метода требует другого), будет выполняться неявное преобразование, и будет использоваться правильный тип.

Метод a, который вы написали в Scala, действительно возвращает A[java.lang.Boolean]. Поскольку нет никакого неявного преобразования между A[java.lang.Boolean] и A[scala.Boolean], он не будет автоматически возвращать A[scala.Boolean] в этом случае.

Чтобы убедиться, что это так, то мы можем видеть, что этот метод компилируется без проблем:

def a: A[java.lang.Boolean] = new AT() 

Вновь подтвердить точку, потому что мы не имеем неявное преобразование, это также не будет работать (вы увидите, как это может быть исправлено ниже):

val instanceOfA: A[Boolean] = a 
def a = new AT() 
// Error: AT doesn't conform to A[Boolean] 

чтобы это исправить, можно неявно преобразовать к нужному типу литьем его:

implicit def toScalaABoolean(a: A[java.lang.Boolean]): A[Boolean] = 
     a.asInstanceOf[A[Boolean]] 

Сделав это, вы не должны даже объявить тип возвращаемого a метода больше:

implicit def toDifferentBoolean(a: A[java.lang.Boolean]): A[Boolean] = 
    a.asInstanceOf[A[Boolean]] 
val instanceOfA: A[Boolean] = a 
def a = new AT() 
Смежные вопросы