3

これは既存のインターフェースです。

public interface MyInterface<T, U> {
    public T foo(U u);
}

T と U が同じ型であるという仮定の下で、このインターフェイスを実装したいと考えています。型パラメーターをそのままにしておくことができ、この特定の実装を同じ型の 2 つだけでインスタンス化する限り、機能する可能性があると思いました。

public class MyOuterClass<A> {

    public class MyClass<T, U> implements MyInterface<T, U> {

        @Override
        public T foo(U u) {
            return u; //error here
    }

    //even though in the only instantiation of MyClass, T and U are the same
    private MyClass<A, A> myInstance = new MyClass<A, A>();

}

しかし、おそらく当然のことながら、型 T と U は互換性がないため、これは機能しません。

それで、 MyClass を変更して、そのタイプが常に同じであることを指定するように変更できるのではないかと考えましたがMyClass<A, A> implements MyInterface<A, A>、T が既に定義されているというエラーが表示されます。

2 つの型が同じになるように MyClass を実装する方法はありますか?

(私は Java よりも C++ 派なので、Java のジェネリックについて基本的なことが抜けていたらごめんなさい。)

4

2 に答える 2

2

myclass は次のようにする必要があります。

public class MyClass<T> implements MyInterface<T, T> {

    @Override
    public T foo(T in) {
        return in;
    }
}

提案されたクラス定義が何をするかを確認しましょう。

public class MyClass<T, U> implements MyInterface<T, U>

このコードでは、それぞれ次の 2 つのことTU行います。

  • MyClass最初の出現で、クラスの型変数を定義します
  • MyInterface2 回目の出現では、クラスの具象型を指定します。

Tとはクラスの本体内にあり、U制限のない型変数 (つまり、実際の型については何も知られていない) であるため、互換性がないと見なされます。

型変数を 1 つだけ持つことでMyClass、仮定が明確になります。型は 1 つしかなく、インターフェイスの両方の型に使用しています。

最後になりましたが、ソースが完全に処理されると、型のコンパイルが完了することに注意してください。言い換えれば、C++ が行うこととは反対に、ジェネリック型 (C++ の「テンプレート型」など; さびた用語で申し訳ありません) の「インスタンス化」は処理されませ。JVMに関する限り、これらは同じタイプです(実際にそれらを区別するのはコンパイラだけです)MyClass<Foo>MyClass<Bar>

于 2013-04-08T16:34:22.833 に答える
1

の単一の型パラメーターを定義しますMyClass

class MyOuterClass<A> {

    public class MyClass<T> implements MyInterface<T, T> {

        public T foo(T u) {
            return u;
        }
    }

    // Need only one 'A' here.
    private MyClass<A> myInstance = new MyClass<A>();

}

あなたが言う時

public class MyClass<T> implements MyInterface<T, T> {

...に対して1 つの汎用変数を定義しており、それが との両方の役割をMyClass果たしていると言っています。TUMyInterface

于 2013-04-08T16:34:36.987 に答える