У меня есть следующий модуль 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 искаженным и думаю, что оно не должно поддерживаться, в идеале принудительно принудительно компилятором.
Каковы причины не запрещать такой случай?