У меня была такая же проблема с CentOS 6.5. Перед этой ошибкой я нашел причину ошибки следующим образом.
AAPT err(Facade for 1129807373): xxx/aapt: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by xxx/lib64/libc++.so)
« libc.so.6: версия` GLIBC_2.14 'не найдена ». Самая высокая версия CentOS 6.5 - 2.12, и нам нужно обновить ее до 2.14.
Показать установленную версию glibc:
# rpm -qa | grep glibc
Для загрузки соответствующего пакета RPM. -> ftp.redsleeve.org/pub/steam/
Установите пакет RPM следующим образом:
# rpm -Uvh glibc-2.15-60.el6.x86_64.rpm glibc-common-2.15-60.el6.x86_64.rpm glibc-devel-2.15-60.el6.x86_64.rpm glibc-headers-2.15-60.el6.x86_64.rpm --nodeps --force
Вы можете избавиться от предупреждения следующим образом:
package com.example.bugs;
public class WeirdInnerClassJavaWarning {
private static class InnerClass {
protected InnerClass() {} // This constructor makes the warning go away
public void doSomething() {}
}
final private InnerClass anInstance;
{
this.anInstance = new InnerClass();
this.anInstance.doSomething();
}
}
Как говорили другие, Eclipse жалуется, потому что частный класс без явного конструктора не может быть создан извне, кроме как с помощью синтетического метода что создает компилятор Java. Если вы возьмете свой код, скомпилируете его, а затем декомпилируете с помощью jad (*), вы получите следующее (переформатировано):
public class Test {
private static class InnerClass {
public void doSomething() {}
// DEFAULT CONSTRUCTOR GENERATED BY COMPILER:
private InnerClass() {}
// SYNTHETIC METHOD GENERATED BY THE JAVA COMPILER:
InnerClass(InnerClass innerclass) {
this();
}
}
public Test() {
anInstance.doSomething();
}
// Your instance initialization as modified by the compiler:
private final InnerClass anInstance = new InnerClass(null);
}
Если вы добавите защищенный конструктор, синтетический код не понадобится. Синтетический код теоретически, я полагаю, на мизерную величину медленнее, чем несинтетический код, использующий общедоступный или защищенный конструктор.
(*) Для jad я связался со страницей Википедии ... доменом, на котором размещена эта программа истек, но Википедия ссылается на другую, которую я сам не тестировал. Я знаю, что есть и другие (возможно, более свежие) декомпиляторы, но это тот, который я начал использовать. Примечание: он жалуется при декомпиляции последних файлов классов Java, но по-прежнему выполняет свою работу хорошо.
Вы не можете создать экземпляр InnerClass из WeirdInnerClassJavaWarning. Это конфиденциально, JVM не позволит вам, но язык Java (по какой-то причине) будет.
Таким образом, javac создаст дополнительный метод в InnerClass, который будет просто возвращать new InnerClass (), что позволит вам создать InnerClass экземпляры из WeirdInnerClassJavaWarning.
Я не думаю, что вам действительно нужно избавляться от него, потому что падение производительности будет неизмеримо маленьким. Однако вы можете, если действительно хотите.
Вы сможете избавиться от него, используя область видимости по умолчанию вместо частной или защищенной, т.е.
static class InnerClass ...
. Также стоит отметить, что я помещаю ваш курсор в строку кода с предупреждения и нажатия ctrl-1, Eclipse может исправить это автоматически.
Я до сих пор не понимаю, почему создание защищенного вложенного класса, а не частного - это еще один метод решения "проблемы", но, возможно, это причуда / ошибка Eclipse
Это не причуда / ошибка Eclipse, а просто функция Java. Спецификация языка Java, 8.8.9 гласит:
... если класс объявлен защищенным, то конструктору по умолчанию неявно присваивается модификатор доступа protected ...