У меня есть следующий модуль Java 9:
module com.example.a {
exports com.example.a;
}
С экспортированным типом:
public class Api {
public static void foo(ImplDetail args) {}
}
И неэкпортируемый тип:
package com.example.b.internal;
public class ImplDetail {}
Экспортируемый тип использует неэкпортируемый тип как тип параметра метода в общедоступном методе. Я бы предположил, что компилятор откажется от такой несогласованной конфигурации класса, поскольку клиенты в других модулях не могут действительно вызывать метод foo()
, поскольку они не могут создать тип параметра.
К моему удивлению, этот модуль успешно скомпилирован javac. Я вижу специальный случай передачи null
, но я бы счел, что такое определение API искажено, и подумайте, что он не должен поддерживаться, в идеале компилятором.
В чем причина отказа от такого случая?