2013-06-26 2 views
3

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

public class GeneralClass { 
    public Integer getInt(Double d) { 
     return d.intValue(); 
    } 
} 

Я хотел бы расширить этот класс в Scala, например,

import scala.collection.JavaConversions._ 
import scala.collection.JavaConverters._ 

class SpecializedClass extends GeneralClass { 

    override def getInt(d: Double): Int = { 
    d.intValue() 
    } 
} 

Проблема заключается в том, что ни scala.Double, ни scala.Int автоматически преобразуются в соответствующие типы Java.

Редактировать Сообщение об ошибке:

метод GetInt не отменяет ничего. Примечание: супер классы класса SpecializedClass содержат следующие не конечные элементы с именем GetInt: Защиту GetInt (d: Double): Integer

Может кто-нибудь объяснить, что и, возможно, указать на элегантное решение?

ответ

1

Попробуйте

override def getInt(d: Double): Integer = { 
    return Integer.valueOf(d.intValue()); // explicit boxing 
} 
1

Это действительно не переопределить существующий метод (из-за различных типов).

Таким образом, одна из возможных - удалить override.

С другой стороны, если вы действительно хотите иметь override ключевое слово:

override def getInt(d: java.lang.Double): java.lang.Integer = { 
    d.intValue() 
} 

Вообще говоря, используя примитивные типы данных в Java/Scala взаимодействия может быть сложнее: Вот еще один пример, который имеет дело с примитивным данных вместе с scala.Option.

1

getInt в SpecializedClass не отменяет метод в GeneralClass. Чтобы иметь возможность переопределить, аргумент функции в SpecializedClass должен быть контравариантным, а возвращаемый тип должен быть ковариантным. Что в вашем случае нет.

Так что, если у вас есть что-то в getIntSpecializedClass в который принимает тип T :> java.lang.Double и тип возвращаемого значения, как T <: java.lang.Integer, это не отменяет его.

На ваш вопрос, на самом деле я не чувствую необходимости иметь такой метод, как компилятор Scala будет неявно преобразовывать Java double в Scala Double.

+0

Я думаю, что ваш ответ ближе всего к тому, что я искал. Не могли бы вы предоставить какие-либо ссылки для его резервного копирования? – rarry

+0

Я написал небольшое сообщение о ковариации и контравариантности. http://jatinpuri.com/2012/11/co-variance-contra-variance/ надеюсь, что это будет полезно. Для Implicits, http://www.artima.com/pins1ed/implicit-conversions-and-parameters.html - лучшая ссылка. – Jatin