Scala重写Java方法问题记录1-参数列表中的Object和Object...

Java方法签名:
protected abstract DB createResource(Object owner, String iDatabaseName, Object... iAdditionalArgs);
(DB为类中声明的类型参数,其中与Scala代码不同的有
【1】protected,Scala的作用于比Java中更小
【2】Object,Scala中Any,AnyRef都是Object类型的,classOf[Any],classOf[AnyRef]的结果都是Object

【3】可变参数Object...,翻译成Scala就是AnyRef*)

IDEA自动生产的方法签名为:
def createResource(owner: Any, iDatabaseName: String, iAdditionalArgs: Array[AnyRef]): OObjectDatabaseTx = ???
这时候编译器还不认这个方法,因此需要简单改造一下:前面加上override和protected修饰符,并将Array[AnyRef]改为AnyRef*。然后这个方法就能通过编译了。
override protected def createResource(owner: Any, iDatabaseName: String, iAdditionalArgs: AnyRef*): OObjectDatabaseTx = ???
这时候我们会发现参数列表中的Object被翻译为Any,而Object...被翻译成AnyRef*。为了验证两者的差异,我把owner的类型改为AnyRef,保存编译,编译器马上报出异常:
error: method createResource overrides nothing.
Note: the super classes of class OObjectDatabasePool contain the following, non final members named createResource:
protected[package db] def createResource(x$1: Any,x$2: String,x$3: <repeated...>[Object]): org.misty.orient.object.db.OObjectDatabaseTx
override protected def createResource(owner: AnyRef, iDatabaseName: String, iAdditionalArgs: AnyRef*): OObjectDatabaseTx = ???
一开始看这一堆莫名其妙的错误信息实在摸不着头脑。这个错误频繁出现,于是细读。大致是说:
父类xxx包含如下名为yyy的非final成员zzz,而子类提供的却是另外一个。
说白了就是编译器期望得到的是:
protected[package db] def createResource(x$1: Any,x$2: String,x$3: <repeated...>[Object]):
而子类提供的却是:
override protected def createResource(owner: AnyRef, iDatabaseName: String, iAdditionalArgs: AnyRef*): OObjectDatabaseTx = ???
两者无法匹配导致无法编译。由于我们是修改了参数列表中的第一个参数的类型导致的错误,因此只需将第一个参数的类型改回Any即可,同时可见虽然我们将方法的包访问权限缩小了(从protected[package db]缩小为protected),但编译器并不是很介意。

转载于:https://my.oschina.net/u/580483/blog/110062

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值