3

このようなもの:

class C {

    typeof(this) foo() { return this; }

}

Java 6 では不可能であることはわかっているので、Java 7 でそれができるかどうかを知りたいです。

編集

これは、メソッド呼び出しをチェーンするのに役立ち、次のように一時的なローカル変数を作成しないようにする必要があります。

class Entity {

    typeof(this) refresh();

    typeof(this) clone();

    typeof(this) detach();

}

class FooEntity extends Entity {

    @Override
    typeof(this) detach() {
        fooLink21.removeRef(this); 
        bar39.detach(); 
        return this; 
    }

    void doSomeInteresting() {}
}

fooEntity.clone().detach().doSomeInteresting();

などなど。

この関数をコンパイラに追加するのは非常に簡単だと思いますが、おそらくopenjdkまたはgcjにハックする必要がありますか?

ところで、openjdk の再構築に成功したことはありません。

4

4 に答える 4

5

ジェネリックを使用する場合は、次のようになります。

class Parent<C extends Parent> {

   public C getMe (){
      return this;
   }
}

class Sub extends Parent<Sub> { }

うまくいくかもしれませんが、このようなコードを書くことはお勧めしません。設計が悪いな…

于 2011-04-25T13:07:30.410 に答える
2

Java 6でもJava 7でも、これを行う方法はないと思います。追加するのは簡単ではありません-戻り値の型は「依存型」と呼ばれるものになると思いますが、それははるかに複雑なJava が現在持っているよりも型システム。

私の知る限り、基本クラスに型パラメーターを追加することに関するGressieの答えは、あなたが望むものに近づく唯一の方法です。

ただし、ヘルパー関数を使用する準備ができている場合は、クラスの型パラメーターなしで実行できます。

abstract class Entity {
    public static <T extends Entity> T detach(T entity) {
        entity.detach();
        return entity;
    }
    protected abstract void detach();
}

次に、次のように言うことができます。

import static Entity.detach;

detach(fooEntity).doSomeInteresting();

しかし、それはかなり不格好です。

于 2011-04-25T15:12:12.670 に答える
1

Java(主にC#/ C ++を使用するSDの2年生)についてはよくわかりませんが、ジェネリックスを検討することをお勧めします。それらがC++、C#に関連していると私が思うものである場合、それらはテンプレートのようなものであり、テンプレートタイプを返すメソッドを記述できます。

http://en.wikipedia.org/wiki/Generics_in_Java

于 2011-04-25T12:52:05.450 に答える
1

あなたがしているように見えることから、コンストラクターを使用してみませんか? また、メソッドを返す方法を尋ねているように見えますか? もしそうなら:

Java でメソッドを返すことができます。この慣行に代わるものを検討しないことを強くお勧めします。java.lang.reflectを見てください。メソッド、フィールド、およびコンストラクターへのアクセスを提供します。Java は、ファーストクラスの関数を扱うことを意図したものではありません。これを行うことにした場合は、多くの catch ステートメントに備えてください...

于 2011-04-25T13:17:49.483 に答える