5

インターフェイス「Inter」があり、Interにはメソッドがあるとしましょう

Inter someMethod();

返されるオブジェクトの型が、メソッドが呼び出されるオブジェクトと同じでなければならないことをどのように指定できますか? したがって、Inter を実装する 2 つのクラス「C1」と「C2」がある場合、C1 のインスタンスが someMethod( c1.someMethod()) を呼び出すと、結果は C1 のインスタンスになり、C2 のインスタンスが someMethod を呼び出すと、結果は次のインスタンスになります。 C2.

パラメータはどうですか?インテルに第二の方法がある場合

void someMethod2(Inter inter)

パラメータがメソッドを呼び出すオブジェクトと同じクラスのインスタンスでなければならないことをどのように指定できますか?

4

3 に答える 3

10

ジェネリックの使用。

public interface Inter<T> {

    T someMethod();
    void someMethod2(T obj);

}

public class C1 implements Inter<C1> {

    public C1 someMethod() {
      // ..
    }

    public void someMethod2(C1 obj) {
      // ..
    }

}

public class C2 implements Inter<C2> {

    public C2 someMethod() {
      // ..
    }

    public void someMethod2(C2 obj) {
      // ..
    }

}

参照:
ジェネリック型 (Java™ チュートリアル > ジェネリック)

編集:(OPのコメントに応じて、境界付きジェネリック型を使用)

public interface Inter<T extends Inter<T>> {

    T someMethod();
    void someMethod2(T obj);
}

public class C1 implements Inter<C1> {

    public C1 someMethod() {
        return new C1();
    }

    public void someMethod2(C1 obj) {
      // ..
    }
}

public class C2 implements Inter<C3> { // ERROR
    ..
}

しかし、ここで問題が発生します。

public class C2 implements Inter<C1> { // COMPILES!
    ..
}

C1も満たすからT extends Inter<T>です。これは私が信じることができる限りです。

参照:
境界型パラメーター (Java™ チュートリアル > ジェネリック)

于 2013-06-29T20:50:49.027 に答える
2

このようなものを試すことができます

public interface Inter<T> {

    public T doSomething();
}

public class C1 implements Inter<C1> {

    @Override
    public C1 doSomething() {
        return new C1();
    }
}

public class C2 implements Inter<C2> {

    @Override
    public C2 doSomething() {
        return new C2();
    }
}
于 2013-06-29T20:53:59.460 に答える
0

返されるオブジェクトの型が、メソッドが呼び出されるオブジェクトと同じでなければならないことをどのように指定できますか?

これは Java では実行できません。

于 2013-06-30T20:59:54.310 に答える