У меня естьJava шаблон завод, использующий общие ограничения
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» и «разбор вызова»?
Также мне было интересно, если есть способ обеспечить IFoo < -> Foo реализует отношения во время компиляции в getItem()
методы и удалить типажи (T)
?
EDIT: Я думал, что я дал бы наброски 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;
}
На самом деле, это никогда не проверяет, что Foo можно использовать для IFoo, так как общий ролик, подобный этому, удаляется во время выполнения. – jtahlborn
Вы хотите, чтобы 'return clazz.cast (item);'. – jtahlborn
@jtahlborn Да, действительно. – assylias