2013-06-26 58 views
3

我有下面的类中的Java:隐式转换,超控,互操作性

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

我想在阶例如扩展此类

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:双人间):整数

可有人解释说,也许指出一个优雅的解决方案吗?

回答

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 in 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