2

テンプレートメソッド(foo1)のメソッド(foo2)を使ってみたところ、コンパイラはそのクラス(T)に属するこのメソッド(foo2)を知らないと言っていました。

正しい構文は何ですか、どのコンパイラがそれを受け入れますか?

private void foo1<T>(T instance)
{
    instance.foo2();
}
4

2 に答える 2

8

以下のコードスニペットのように、ジェネリック型に制約を作成する必要があります。

private void foo1<T>(T instance) where T : IFoo
{ 
    instance.foo2(); 
}

interface IFoo
{
    void foo2();
}

これは、クローズドジェネリック型はインターフェイスからのみ派生できることを定義していIFooます。しかし、なぜあなたは以下に与えられたような非ジェネリックバージョンに固執しませんか?

private void foo1(IFoo instance) 
{ 
    instance.foo2(); 
}

interface IFoo
{
    void foo2();
}
于 2013-01-06T15:24:18.227 に答える
2

ジェネリック型に制約のないジェネリックメソッドを使用しています。

これは、任意のオブジェクトにすることができることを意味します。ほとんどのオブジェクトにはメソッドがないため、コンパイラは文句を言っていますfoo2

foo2()ジェネリックパラメーターでそのメソッドを呼び出せるようにする場合は、ジェネリック型をメソッドを持つ型に制約する必要があります。

または、ジェネリックスを使用せずに、ジェネリックスでfoo2定義されている抽象型を渡します。

于 2013-01-06T15:22:34.173 に答える