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.Propertiespublic V get(Object key)fromを継承します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

}

Typesafeチームが追跡した4つの問題をここで編集

4

1 に答える 1

2

適切なクラスファイルを見ていません。逆コンパイルしてみてくださいMyProperties$

更新:残念ながら、あなたが実際にの静的フォワーダーを探していたことがわかりましたget。から消えた理由は、自動生成された静的フォワーダーと競合する(から継承された)クラス内MyProperties.classのメソッドがすでに存在するためです(したがって、コンパイラーはそれを生成しません)。詳細については、以前に作成した他の回答を参照してください:https ://stackoverflow.com/a/14379529/1632462getMyPropertiesProperties ただし、署名が異なるため、通常は競合が発生しないことをお伝えしておきます(静的メソッドと非静的メソッドは同じ名前空間を共有しているため、一方が静的でもう一方が静的ではないという事実とは異なります)。 JVM AFAIK)。コンパイラは簡単なルートを取り、正確なシグネチャをチェックするのではなく、メソッド名の存在をチェックするだけだと思います。

ここでそれを修正する1つの方法は、名前を変更することです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 に答える