クラス A またはクラス B を返す可能性のあるメソッドがあります。返されるクラスの型に関係なく、戻り値の型をジェネリックに定義するにはどうすればよいですか。例えば
public <Generic_Class_Return_Type> showForm() {
if (true)
return new ClassA();
else
return new ClassB();
}
Not really sure if you need generics in this case, however you can parameterize either the whole class or just the method and then use reflection like this:
public <T> T getForm() {
Class<T> clazz = (Class<T>) ((true) ? Foo.class : Bar.class);
Constructor<T> ctor = clazz.getConstructor();
return ctor.newInstance();
}
However if you specify your use case, we can further suggest if going generics is the way, or if you'd better use standard polymorphism.
両方のクラスが次のように実装するインターフェースを使用できます。
public SomeInterface showForm() {
if (true)
return new ClassA();
else
return new ClassB();
}
class ClassA implements SomeInterface{}
class ClassB implements SomeInterface{}
public object showForm()
{
if (true)
return new ClassA();
else
return new ClassB();
}
また
public superClassName showForm()
{
if (true)
return new ClassA();
else
return new ClassB();
}
最も簡単な方法は、それらをオブジェクトとして返すことです。
public Object showForm() {
if (true)
return new ClassA();
else
return new ClassB();
}
それほど有用ではありませんが、はるかに有用な解決策は、共通のクラスを拡張するか、共通のインターフェイスを実装することです。
public CommonInterface showForm() {
if (true)
return new ClassA();
else
return new ClassB();
}
class ClassA implements CommonInterface { }
class ClassB implements CommonInterface { }
interface CommonInterface { }
または
public CommonClass showForm() {
if (true)
return new ClassA();
else
return new ClassB();
}
class ClassA extends CommonClass { }
class ClassB extends CommonClass { }
class CommonClass { }
ジェネリック
ジェネリックを使用したい場合はClassA
、ClassB
ジェネリック型などで変更された同じクラスである必要があります。Class<T>
. ジェネリックが関連するかどうかは、すべてクラスの実装に依存します。おそらく、インターフェイスまたは基本クラスを使用するのが最善です。