2

C#で記述したコードをJavaに移植しようとしていますが、Java構文のすべてをまだ理解していません。また、この種のことを何と呼んでいるのかわからないので、検索が難しくなります。「継承制約」と呼んでいます。

基本的に、このC#コードに相当するJavaはありますか?

public abstract class MyObj<T> where T : MyObj<T>, new()
{

}

ありがとう。


編集:

これを行う方法はありますか?

public abstract class MyObj<T extends MyObj<T>> {
    public abstract String GetName();

    public virtual void Test() {
          T t = new T();                // Somehow instantiate T to call GetName()?
          String name = t.GetName();
    }
}
4

2 に答える 2

9

完全ではありません。これがあります:

public abstract class MyObj<T extends MyObj<T>>

new()しかし、制約に相当するものはありません。

編集:のインスタンスを作成するにはT、適切なものが必要ですClass<T>-そうでない場合、型消去はあなたをバイトします。

通常、これをコンストラクターパラメーターとして追加します。

public MyObj(Class<T> clazz) {
    // This can throw all kinds of things, which you need to catch here or
    // propagate.
    T t = clazz.newInstance(); 
}
于 2012-11-19T18:24:52.757 に答える
1

上記のコメントから判断すると、次の構成を探しています。

コード内interfaceでMyObjオブジェクトを操作するために使用します...test()メソッドを呼び出します(Javaの標準スタイルはキャメルケースメソッド、大文字のクラス/インターフェイスです)

public interface IMyObj {
    public void test();
}

抽象スーパークラスが必要になります...選択した例では、ジェネリシズムを指定する必要はありませんが、実際の実装が型安全性に依存している場合は絶対に可能です...このクラスはIMyObjインターフェース:

public abstract class MyObj implements IMyObj {

    String name;

    public abstract String getName();

    public void test() {
        name = getName();
    }
}

ここから、サブクラスをMyObjに書き込みます...

public class MySubObj1 extends MyObj {
    public String getName() { return "MySubObj1"; }
}

public class MySubObj2 extends MyObj {
    public String getName() { return "MySubObj2"; }
}

次に、別のクラスで次のスニペットを安全かつ正しく使用します。

IMyObj obj = new MySubObj1();
obj.test();

重要なのは、インターフェースを使用して実装を非表示にし、抽象クラスを使用して、サブクラスが実装で利用する共通のコードを保持することです。

お役に立てれば!

于 2012-11-20T13:48:44.000 に答える