Возможно ли создать экземпляр универсального типа в Java? Я думаю, основываясь на том, что я видел, что ответ таков no (из-за удаления типа), но мне было бы интересно, может ли кто-нибудь увидеть что-то, чего я не вижу:
classSomeContainer<E> { E createContents() { return what??? } }
РЕДАКТИРОВАТЬ: Оказывается, для решения моей проблемы можно использовать токены супертипа, но для этого требуется много кода, основанного на отражении, как указано в некоторых ответах ниже.
Я оставлю этот вопрос открытым на некоторое время, чтобы посмотреть, придумает ли кто-нибудь что-нибудь кардинально отличающееся от статьи Artima Яна Робертсона.
Переведено автоматически
Ответ 1
Вы правы. Вы не можете этого сделать new E(). Но вы можете изменить это на
privatestaticclassSomeContainer<E> { E createContents(Class<E> clazz) { return clazz.newInstance(); } }
Это мучительно. Но это работает. Обертывание его заводским шаблоном делает его немного более терпимым.
Ответ 2
В Java 8 вы можете использовать Supplier функциональный интерфейс для достижения этой цели довольно легко:
Я не знаю, помогает ли это, но когда вы создаете подкласс (в том числе анонимно) универсального типа, информация о типе доступна через отражение. например,