Тип стирание мешает тому, что вы пытаетесь сделать.Я бы просто передал ThingX
(или ThingX.class
), как вы упомянули.К сожалению, стирание типа заставляет вас делать такие вещи hacky .
Лучше всего думать о том, что ваш код разделен на две области: универсальная и универсальная, и когда вам нужно склеить что-то одно с более поздним в первое, нет способа избежатьодин из двух (для контроля): либо
либо передавать параметры просто для запуска проверки типа (как вы предложили):
Collection<ThingA> ta2 = mockFactory.newCollection(ThingA.class);
Collection<ThingB> tb2 = mockFactory.newCollection(ThingB.class);
Collection<ThingC> tc2 = mockFactory.newCollection(ThingC.class);
, либо инкапсулировать код, не связанный с универсальным кодом, в методы, которыеа) совместимы с генериками и б) имеют аннотацию @SuppressWarnings("unchecked")
для подавления предупреждения, которое вы получите при назначении из одного домена в другой.
class MockFactoryThingie
{
/**
*@SuppressWarnings("unchecked")
*/
Collection<ThingA> newThingACollection()
{
return (Collection<ThingA>) ... your generic-unaware collection thing...
}
}
Любой способ неуклюж.Мы должны поблагодарить наших повелителей Java / JCP за то, что они дали нам этот драгоценный камень типа erasure:)