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),但编译器并不是很介意。

你可能感兴趣的:(scala)