Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Это означает, что вы вызываете общий статический метод, называемый of
в классе ImmutableMap
.
Это почти то же самое, что вы вызываете метод static
, вложенный в некоторый класс:
SomeClass.staticMethod();
Для случаев, когда ваш метод имеет определенный параметр типа, вы можете явно предоставить общий тип, и это делается следующим образом:
SomeClass.<Type>genericStaticMethod();
И ответить на окончательный вопрос:
В чем разница между
blockquote>ImmutableMap<Class...>
иImmutableMap.<Class...
?Первое обычно используется при создании экземпляра общего класса. Он используется для определения типа generic на уровне класса, а второй используется для вызова универсального статического метода, который вложен в некоторый класс.
Общие методы - это методы, объявленные с помощью любого типичного параметра типа. См. 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);
Это относится к статическому методу 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.
fromArrayToCollection(sa, cs); // T inferred to be String
– aalku 27 November 2014 в 10:18