首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala eq问题

Scala eq问题
EN

Stack Overflow用户
提问于 2011-02-28 09:08:11
回答 2查看 919关注 0票数 3

我对Scala中的以下代码有问题

代码语言:javascript
复制
import org.junit.Test
import org.junit.Assert._

class BoxingTest {

    val holder: Holder[Integer] = new Holder[Integer]();

    @Test
    def Holder_Eq_Primitive(){        
        assertEquals(holder, holder eq 1);
    }

    @Test
    def Holder_Eq_Boxed(){        
        assertEquals(holder, holder eq 1.asInstanceOf[Integer]);
    }

}

class Holder[T] {

    def eq(other: T): Holder[_] = this;
}

我在编译过程中出现以下错误

代码语言:javascript
复制
/BoxingTest.scala:12: error: type mismatch;
[INFO]  found   : Int
[INFO]  required: AnyRef
[INFO] Note: primitive types are not implicitly converted to AnyRef.
[INFO] You can safely force boxing by casting x.asInstanceOf[AnyRef].
[INFO]         assertEquals(holder, holder eq 1);
[INFO]                                     ^
[ERROR] one error found
[INFO] -------------------------

为什么从Int到Integer的隐式转换不能处理这个问题?

我可以很容易地通过不使用eq来修正代码,但这似乎不太正确。IMHO可用的隐式转换应该在这里应用。

更新

我用这样的签名解决了问题

代码语言:javascript
复制
import org.junit.Test
import org.junit.Assert._

class BoxingTest {

    @Test
    def Holder_Eq_Primitive(){
        val holder: Holder[Int] = new Holder[Int]();
        assertEquals(holder, holder eq 1);
    }

    @Test
    def Holder_Eq_Boxed(){
        val holder: Holder[Integer] = new Holder[Integer]();
        assertEquals(holder, holder eq 1.asInstanceOf[Integer]);
    }

}

class Holder[T] {

    def eq(other: T): Holder[_] = ...;
}

不过,最好还是使用包装器类型。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-20 17:19:53

我尝试将Int值与整数文本进行比较,并从编译器那里得到了一些有趣的注释。这可能说明了这种行为的原因。

代码语言:javascript
复制
scala> val a = 1
scala> a eq 1
<console>:6: error: type mismatch;
 found   : Int
 required: ?{val eq: ?}
Note that implicit conversions are not applicable because they are ambiguous:
 both method int2Integer in object Predef of type (Int)java.lang.Integer
 and method intWrapper in object Predef of type (Int)scala.runtime.RichInt
 are possible conversion functions from Int to ?{val eq: ?}
       a eq 1
       ^
票数 2
EN

Stack Overflow用户

发布于 2011-11-27 13:00:54

我认为这是关于Java 的。当您编译类时

代码语言:javascript
复制
class Holder[T] {

    def eq(other: T): Holder[_] = this;
}

类型T将被删除。你可以做一个测试:

另一方面,Int类是AnyVal的子类型,而不是AnyRef。因此,如果尝试使用带有参数1 (类型为Int)的方法Int,则会发出运行时错误。

PS:虽然Int可以隐式地转换为java.lang.Integer,但正如Vilius所指出的,它也可以隐式地转换为RichInt。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5139962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档