& Л;? & GT; Opperator для .getClass () [duplicate]

Если вы используете Java 8, и вы готовы написать несколько методов многократного использования, вы можете сделать это в одной строке.

private Map<String, List<String>> parse(final String query) {
    return Arrays.asList(query.split("&")).stream().map(p -> p.split("=")).collect(Collectors.toMap(s -> decode(index(s, 0)), s -> Arrays.asList(decode(index(s, 1))), this::mergeLists));
}

private <T> List<T> mergeLists(final List<T> l1, final List<T> l2) {
    List<T> list = new ArrayList<>();
    list.addAll(l1);
    list.addAll(l2);
    return list;
}

private static <T> T index(final T[] array, final int index) {
    return index >= array.length ? null : array[index];
}

private static String decode(final String encoded) {
    try {
        return encoded == null ? null : URLDecoder.decode(encoded, "UTF-8");
    } catch(final UnsupportedEncodingException e) {
        throw new RuntimeException("Impossible: UTF-8 is a required encoding", e);
    }
}

Но это довольно жестокая строка.

100
задан Bozho 29 March 2012 в 22:33
поделиться

6 ответов

Class является параметризуемым классом, поэтому вы можете использовать синтаксис Class<T>, где T - тип. Написав Class<?>, вы объявляете объект Class, который может быть любого типа (? является подстановочным знаком). Тип Class - это тип, содержащий метаинформацию о классе.

Всегда полезно относиться к родовому типу, указывая его конкретный тип, используя Class<?>, что вы соблюдаете эту практику (вы знаете, что Class является параметризуемым) не ограничивая ваш параметр определенным типом.

Ссылка на общие и скрытые символы: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html

Ссылка на объект класса и отражение (особенность языка Java, используемого для самоанализа): http://java.sun.com/developer/technicalArticles/ALT/Reflection/

77
ответ дан manub 18 August 2018 в 04:45
поделиться
  • 1
    В чем преимущество этого, просто используя Class без типа? Кажется, они представляют одно и то же. – ashes999 22 June 2013 в 15:47
  • 2
    Я думал, что весь общий признак - вы не знаете тип класса заранее. В противном случае вы просто определите функцию для использования определенного типа класса для параметра. Этот вопросительный знак все еще не имеет смысла. – Brain2000 6 March 2015 в 18:48
  • 3
    Другого преимущества нет, кроме того, что вы говорите компилятору, что «я знаю, что это общий класс, но я не знаю или не забочусь о фактическом типе, поэтому вместо предоставления конкретного типа я даю ? подстановочный знак. ". Если вы не дадите подстановочный знак, компилятор предполагает, что вы либо забыли тип, либо не знали, что класс является общим, и предупредит вас об этом. – Kayaman 29 February 2016 в 08:51
  • 4
    Что такое эквивалент Котлина Class<?> – JGuo 14 June 2018 в 17:50
  • 5

Этот <?> является зверем. Это часто приводит к путанице и ошибкам, потому что, когда вы видите это сначала, вы начинаете верить, <?> является подстановочным знаком для любого типа java . Что ... неправда. <?> - неизвестный тип, небольшая и неприятная разница.

Это не проблема, когда вы используете его с Class. Обе строки работают и компилируются:

Class anyType = String.class;
Class <?> theUnknownType = String.class;

Но - если мы начнем использовать его с коллекциями, то мы увидим странные ошибки компиляции:

List<?> list = new ArrayList<Object>();  // ArrayList<?> is not allowed
list.add("a String");                    // doesn't compile ...

Наш List<?> не является которая подходит для любого типа объектов. Он может хранить только один тип: мистический «unkown type». Конечно, это не настоящий тип.

49
ответ дан Andreas_D 18 August 2018 в 04:45
поделиться

Это литерал generics . Это означает, что вы не знаете тип класса, который представляет этот экземпляр Class, но вы все еще используете общую версию.

  • , если вы знали класс, вы должны использовать Class<Foo>. Таким образом, вы можете создать новый экземпляр, например, без кастинга: Foo foo = clazz.newInstance();
  • , если вы вообще не используете дженерики, вы получите хотя бы предупреждение (и не используете общие файлы, как правило, обескураженный, поскольку это может привести к жестким обнаруживающим побочным эффектам)
5
ответ дан Bozho 18 August 2018 в 04:45
поделиться

В дженериках неизвестный тип представлен символом подстановки «?». Прочтите здесь для официального примера.

4
ответ дан Jasonw 18 August 2018 в 04:45
поделиться

Это означает класс с типом чего-либо (неизвестным).

Вы должны прочитать учебник java generics, чтобы лучше понять его

3
ответ дан Matt 18 August 2018 в 04:45
поделиться

Это означает, что ссылка на ваш класс может содержать ссылку на любой объект класса.

Это в основном то же, что и «класс», но вы показываете других людей, которые читают ваш код, который вы не забыли generics, вам просто нужна ссылка, которая может содержать любой объект класса.

Брюс Экель, Думая на Java:

В Java SE5 класс & lt;?> является предпочтительным по сравнению с обычным Класс, хотя они эквивалентны, и обычный класс, как вы видели, не дает предупреждения о компиляторе. Преимущество класса & lt;?> Заключается в том, что оно указывает, что вы не просто используете неспецифическую ссылку на класс случайно или из-за незнания. Вы выбрали неспецифическую версию.

6
ответ дан Sami Kuhmonen 18 August 2018 в 04:45
поделиться
  • 1
    В цитате сказано «Класс & lt; & gt; является предпочтительным по сравнению с обычным классом " и "Преимущество Класса & lt; & gt;". Кажется, blockquote не согласуется с угловыми скобками. – Filip 29 March 2012 в 18:13
  • 2
    Его нужно избегать. Исправлено: P – Sami Kuhmonen 29 February 2016 в 08:08
Другие вопросы по тегам:

Похожие вопросы: