Поведение транзистивной проверки типов компилятора Java - PullRequest
0 голосов
/ 20 сентября 2019

Рассмотрим следующий сценарий:

Допустим, у меня есть класс A в папке "src" моего проекта.

class A {

  void foo() {
     B b = new B();
  }

}

Класс B определен в другом фляге, который включен какзависимость в build.gradle

class B extends C {


}

Теперь класс C определен в другом jar-файле, который будет предоставлен во время выполнения, а не во время компиляции.Gradle может скомпилировать класс A без ошибок.

Но, когда я импортирую класс c в класс A, он дает «класс не найден».


import other.C; // this line gives error 

class A {

  void foo() {
     B b = new B();
  }

}

Является ли это желаемым поведениемJava компилятор игнорирует класс C, если он не импортирован напрямую?

Кроме того, что произошло, если использовать функцию в классе A с использованием объекта B, который находится в классе C, но не переопределен в классе B.

1 Ответ

0 голосов
/ 23 сентября 2019

Точный ответ на ваш вопрос зависит от версии компилятора Java и требует ли он доступа к C для выполнения своей работы.

В целом, я бы сказал, что такая установка хрупкаяи ты не должен этого делать.Если вашей библиотеке, которая определяет A, требуется B, которая эффективно использует C в ее общедоступном API , как в случае extends, тогда C следует сделать видимым для вашей библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...