テンプレートメソッド(foo1)のメソッド(foo2)を使ってみたところ、コンパイラはそのクラス(T)に属するこのメソッド(foo2)を知らないと言っていました。
正しい構文は何ですか、どのコンパイラがそれを受け入れますか?
private void foo1<T>(T instance)
{
instance.foo2();
}
テンプレートメソッド(foo1)のメソッド(foo2)を使ってみたところ、コンパイラはそのクラス(T)に属するこのメソッド(foo2)を知らないと言っていました。
正しい構文は何ですか、どのコンパイラがそれを受け入れますか?
private void foo1<T>(T instance)
{
instance.foo2();
}
以下のコードスニペットのように、ジェネリック型に制約を作成する必要があります。
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();
}
ジェネリック型に制約のないジェネリックメソッドを使用しています。
これは、任意のオブジェクトにすることができることを意味します。ほとんどのオブジェクトにはメソッドがないため、コンパイラは文句を言っていますfoo2
。
foo2()
ジェネリックパラメーターでそのメソッドを呼び出せるようにする場合は、ジェネリック型をメソッドを持つ型に制約する必要があります。
または、ジェネリックスを使用せずに、ジェネリックスでfoo2
定義されている抽象型を渡します。