编译后,对象的静态方法消失了

时间:2013-03-07 15:02:05

标签: scala

使用这段非常简单的代码

import java.util.Properties

class MyProperties extends Properties

object MyProperties {

    def get(): MyProperties = new MyProperties

    def anotherMethod(): MyProperties = new MyProperties

}

编译代码中缺少get()方法; MyProperties类的Java反编译产生(省略了scala签名)

import java.util.Properties;
import scala.reflect.ScalaSignature;

public class MyProperties extends Properties
{
  public static MyProperties anotherMethod()
  {
    return MyProperties..MODULE$.anotherMethod();
  }
}

但如果MyProperties未延伸java.util.Properties,则会生成get()方法。

java.util.Propertiespublic V get(Object key)继承java.util.Dictionary,但这是一种具有不同签名的非静态方法。

为什么生成的字节码中缺少(静态)get()方法?

Scala 2.10.1-rc2 - JVM 1.6.0_41

修改 与2.10.0相同的问题

编辑2 这在java中“起作用”

import java.util.Properties;

public class MyPropertiesjava extends Properties {

    private static final long serialVersionUID = 1L;

    public static MyProperties get() {

        return new MyProperties();
    }

    public static MyProperties antotherMethod() {

        return new MyProperties();
    }
}

编辑3 下面对Régis解决方法的一个小编辑(类型不能是“全局”)

import java.util.Properties

class MyPropertiesImpl extends Properties

object MyProperties {

    type MyProperties = MyPropertiesImpl

    def get(): MyProperties = new MyPropertiesImpl

    def anotherMethod(): MyProperties = new MyPropertiesImpl

}

编辑4 由Typesafe团队here

跟踪的问题

1 个答案:

答案 0 :(得分:2)

您没有查看正确的类文件。尝试反编译MyProperties$

更新:我的不好,我现在明白你实际上正在寻找get的静态转发器。它从MyProperties.class消失的原因是因为类get中已经存在MyProperties方法(继承自Properties),这会与自动生成的静态转发器冲突(和所以编译器会 *不生成它。请参阅我之前提到的其他答案,了解更多背景信息:https://stackoverflow.com/a/14379529/1632462 但是,我必须说你提出一个好点,通常不应该有冲突,因为它们有不同的签名(不像一个是静态而另一个不是,因为静态和非静态方法共享相同的命名空间JVM AFAIK)。我想编译器采用了简单的路由,只是检查方法名称的存在,而不是检查确切的签名。

这里修复它的一种方法是重命名MyProperties(并可能添加一个类型别名,以便API保持不变):

class MyPropertiesImpl extends Properties
type MyProperties = MyPropertiesImpl 
object MyProperties {
    def get(): MyProperties = new MyPropertiesImpl
    def anotherMethod(): MyProperties = new MyPropertiesImpl
}

由于MyProperties不再是MyPropertiesImpl的伴侣,因此问题就会消失。