Ответ
Нет, нельзя. В одном classloader'е (загрузчике классов) Java не может загрузить два класса с одинаковым полным именем (fully qualified name), включающим пакет.
Почему:
- Имя класса вместе с пакетом (
com.example.MyClass) является его уникальным идентификатором в JVM. - При попытке загрузить класс с уже существующим именем будет выброшено
java.lang.LinkageError.
Исключения и обходные пути:
- Разные ClassLoader'ы: Можно создать два изолированных classloader'а, каждый из которых загрузит свою версию класса. Это используется в серверах приложений для изоляции веб-приложений.
- Модули (Java 9+): Модульная система позволяет иметь "скрытые" (non-exported) классы с одинаковыми именами в разных модулях, если они не экспортируются в общее пространство.
Пример ошибки:
// File 1: com/example/Test.java
package com.example;
public class Test {}
// File 2: com/example/Test.java (такой же пакет и имя)
package com.example;
public class Test {}
// Компиляция возможна в разных директориях,
// но при запуске JVM загрузит только первый найденный класс.