私は持っている
public class MyFactory()
{
public static <T> T getItem(Element element, Class<T> clazz)
{
T item = null;
if (clazz == IFoo.class)
{
item = (T) new Foo();
}
else if (clazz == IBar.class)
{
item = (T) new Bar();
}
...
assert item instanceof IParsable;
(IParsable(foo)).parse(element)
return item;
}
}
そして、私はそれをこのように呼びます
IFoo parsedFoo = MyFactory.getItem(someElement, IFoo.class);
ここで具象クラスは を実装しIParsable
ます。実行時のアサート チェックを削除し、コンパイル時のチェックを入れて、'IParsable' かどうかを確認し、parse を呼び出すことはできますか?
また、メソッドでコンパイル時に IFoo<-->Foo 実装関係を強制しgetItem()
、型キャストを削除する方法があるかどうか疑問に思っていました(T)
か?
編集:私は概要を説明すると思いましIFoo
たFoo
public interface IFoo
{
String getFooName();
int getFooId();
....
}
class Foo implements IFoo, IParsable
{
...
}
EDIT2:
このようなリファクタリングを考えただけで、コンパイル時のチェックではない唯一のものは、インターフェイスと実装の関係です。
public static <U extends IParsable, T> T getItem(Element element, Class<T> clazz)
{
U item = null;
if (clazz == IFoo.class)
{
item = (U) new Foo();
}
else if (clazz == IBar.class)
{
item = (U) new Bar();
}
...
item.parse(element)
return (T) item;
}