0

使用这段非常简单的代码

import java.util.Properties

class MyProperties extends Properties

object MyProperties {

    def get(): MyProperties = new MyProperties

    def anotherMethod(): MyProperties = new MyProperties

}

get()编译后的代码中缺少该方法;类的 Java 反编译MyProperties产生(省略了 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.Propertiesget()方法。

java.util.Properties继承public V get(Object key)fromjava.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

}

编辑 Typesafe 团队在此处跟踪的 4 个问题

4

1 回答 1

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问题的伴侣消失了。

于 2013-03-07T15:20:14.000 回答