Це виникло як питання, яке я нещодавно задав в інтерв'ю, як щось, що хотів бачити кандидат, додане до мови Java. Зазвичай це ідентифікується як біль, що Java не переробляє дженерики, але, натиснувши, кандидат насправді не міг сказати мені того, чого він міг би досягти, якби вони були.
Очевидно, через те, що необмежені типи дозволені в Java (і небезпечні перевірки), можна підривати генеричні дані і в кінцевому підсумку мати List<Integer>
те, що (наприклад) насправді містить String
s. Це, очевидно, могло б бути неможливим, якщо інформація про тип був перероблений; але повинно бути більше, ніж це !
Чи могли б люди розміщувати приклади речей, які вони дійсно хотіли б зробити , чи були вдосконалені загальні дженерики? Я маю на увазі, очевидно, що ти можеш отримати тип List
під час виконання - але що б ти з цим робив?
public <T> void foo(List<T> l) {
if (l.getGenericType() == Integer.class) {
//yeah baby! err, what now?
EDIT : Швидке оновлення цього питання, оскільки відповіді, як видається, в основному викликає занепокоєння щодо необхідності передачі в Class
якості параметра (наприклад EnumSet.noneOf(TimeUnit.class)
). Я шукав більше чогось там, де це просто неможливо . Наприклад:
List<?> l1 = api.gimmeAList();
List<?> l2 = api.gimmeAnotherList();
if (l1.getGenericType().isAssignableFrom(l2.getGenericType())) {
l1.addAll(l2); //why on earth would I be doing this anyway?
findClass()
що доведеться ігнорувати параметризацію, але defineClass()
не зміг). І як ми знаємо, сили, які мають утримувати зворотну сумісність, першорядні.