Невозможно понять ошибку в Java 8 lambda compator с generics [duplicate]

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

9
задан Konstantin Yovkov 3 March 2015 в 21:56
поделиться

3 ответа

Это означает, что вы вызываете общий статический метод, называемый of в классе ImmutableMap.

Это почти то же самое, что вы вызываете метод static, вложенный в некоторый класс:

SomeClass.staticMethod();

Для случаев, когда ваш метод имеет определенный параметр типа, вы можете явно предоставить общий тип, и это делается следующим образом:

SomeClass.<Type>genericStaticMethod();

И ответить на окончательный вопрос:

В чем разница между ImmutableMap<Class...> и ImmutableMap.<Class...?

Первое обычно используется при создании экземпляра общего класса. Он используется для определения типа generic на уровне класса, а второй используется для вызова универсального статического метода, который вложен в некоторый класс.

19
ответ дан Konstantin Yovkov 20 August 2018 в 11:34
поделиться
  • 1
    Обычно вам этого не нужно. См. docs . fromArrayToCollection(sa, cs); // T inferred to be String – aalku 27 November 2014 в 10:18
  • 2
    Это может быть выведено из типа возвращаемого типа (или назначения), но это не всегда возможно. Я просто говорю « вам нужно предоставить общий тип & quot; это не всегда верно – aalku 27 November 2014 в 10:43
  • 3
    @ user270349 Я бы зашел так далеко, чтобы сказать, что утверждение & quot; вам нужно & quot; просто неправильно. – xehpuk 27 November 2014 в 10:47

Общие методы - это методы, объявленные с помощью любого типичного параметра типа. См. Doc здесь . Общий тип метода не обязательно должен быть связан с каким-либо общим типом класса объявления класса. Класс может быть или не быть общим.

При вызове универсального метода (статического или нет) вы можете указать общий тип, но обычно не видите его, потому что он обычно автоопределяется. Этот синтаксис, который вы нашли, является тем, который должен быть указан.

Если есть способ, объявленный следующим образом:

<T> void fromArrayToCollection(T[] a, Collection<T> c) { ...

, вы можете называть его следующим образом:

Integer[] a = ...
ArrayList<Integer> l = ...
x.fromArrayToCollection(a, l);

, но если у вас есть один такой:

<T> Collection<T> myMethod(int c) {
  return new ArrayList<T>(c);
}

Тогда у вас есть два способа прояснить тип компилятору. Вы можете дать ему достаточно информации двумя способами.

Один указывает тип в вызове:

Object c = x.<Integer>myMethod(5);

Другой имеет тип (явный или неявный, назначая переменная):

Collection<Integer> c = x.myMethod(5);
4
ответ дан aalku 20 August 2018 в 11:34
поделиться

Это относится к статическому методу ImmutableMap.of.

class Test {

static <T> T f() { return null; }

void t() {
    String s = Test.f();                 // Inferred from LHS.
    String t = Test.<String>f();         // Not needed.
    int n = Test.<String>f().length();   // Needed.
}

В вашем случае это действительно не нужно, но там я нахожусь на тонком льду, так как общий тип вывода стал немного сильнее в Java 8.

2
ответ дан Joop Eggen 20 August 2018 в 11:34
поделиться
Другие вопросы по тегам:

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