вопросы интервью
Без лишних слов, сразу к теме:
Вопрос: Когда a=1, b=2, каков результат выполнения метода test1? Подумайте минуту.
Отвечать:
Разобрать
При использовании тернарного оператора старайтесь, чтобы типы двух возвращаемых значений были одинаковыми, иначе будет запущено преобразование типов, правила преобразования следующие:
-
Если возвращаемое значение X и возвращаемое значение Y имеют один и тот же тип, то возвращаемый тип, несомненно, относится к этому типу.
-
Если два возвращаемых значения X и Y имеют разные типы, то тип возвращаемого значения является их ближайшим суперклассом. Пример:
// String 和 Boolean 都实现了 Serializable 接口 Serializable serializable = a == b ? "true" : Boolean.FALSE; // 所有类都继承了 Object 类 Object o = a == b ? new ArrayList<>() : new TernaryOperatorDemo();
-
Для примитивных типов данных, если одно из возвращаемых значений X имеет тип
byte
,short
илиchar
, другое возвращаемое значение Y типаint
, то, если во время компиляции можно определить, что диапазон значений Y находится в пределах диапазона значений X, возвращаемый тип — это тип X, в противном случае это тип Y. Если возвращаемое значение X не относится к указанным выше типам, будет запущено преобразование скрытого типа. -
Когда базовый тип данных и объектный тип данных встречаются, тернарный оператор по умолчанию возвращает результат базового типа данных.
Поняв приведенные выше правила, давайте еще раз посмотрим на метод test1.
private static void test1(int a, int b) {
// 触发隐藏类型转换,int 类型 9 转为 9.0D
System.out.println(a == b ? 9.9 : 9);
// 编译期判断,98 在 char 之内,转为 b
System.out.println(a == b ? 'a' : 98);
// 编译期判断,超出char范围,统一转 int
System.out.println(a == b ? 'a' : Integer.MAX_VALUE);
// 编译期时无法判断 b 的取值,触发隐藏类型转换,统一转 int
System.out.println(a == b ? 'a' : b);
System.out.println(a != b ? 'a' : b);
Map<String, Long> map = new HashMap<>();
map.put("b", 1L);
// 基本数据类型和对象数据类型相遇时,默认转为基本数据类,
// map.get("a") 返回 null,转为基本数据类型时,报空指针异常
System.out.println(map == null ? -1L : map.get("a"));
}
Операция
Как изменить метод test1, чтобы код не выдавал исключение нулевого указателя при запуске, предоставьте хотя бы одно решение.
Эта статья была впервые опубликована в личном общедоступном аккаунте WeChat: Coder Xiaohei, каждый может отсканировать код и обратить внимание.