Фактически, я пытаюсь закончить эту практику в "Think in Java" для цели самообучения -
Упражнение 6: (2) Создайте интерфейс, по крайней мере, с одним методом в своем собственном пакете. Создайте класс в отдельном пакете. Добавьте защищенный внутренний класс, который реализует интерфейс. В третьем пакете наследуйте от вашего класса и внутри метода возвращайте объект защищенного внутреннего класса, повышая его до интерфейса во время возврата.
поэтому я создал класс с именем IgetResult.java в каталоге "a", который имеет интерфейс IIGetResult.
interface IIGetResult {
String getResult();
}
public class IgetResult {
}
то я создаю другой класс в другом каталоге - каталог b
import a.IgetResult.IIGetResult;
public class PracticeClass {
protected class inner implements IIGetResult {
@Override
String getResult(){ return "result";}
}
public static void main(String[] args) {
System.out.println("practice start");
}
}
На последнем этапе я скомпилирую два класса Java с помощью команды:
# javac a/.java b/.java
и получите следующую ошибку:
./a/IgetResult.java:1: duplicate class: IIGetResult
interface IIGetResult {
^
./a/IgetResult.java:4: duplicate class: IgetResult
public class IgetResult {
^
b/PracticeClass.java:1: cannot access a.IgetResult
bad class file: ./a/IgetResult.java
file does not contain class a.IgetResult
Please remove or make sure it appears in the correct subdirectory of the classpath.
import a.IgetResult.IIGetResult;
^
Пожалуйста, научите меня проходить эту практику, спасибо заранее.
Согласно цитате:
Создайте интерфейс, по крайней мере, с одним методом в своем собственном пакете.
Поэтому мы создаем файл IGetResult.java
в папке a
:
package a;
public interface IGetResult {
String getResult();
}
Создайте класс в отдельном пакете. Добавьте защищенный внутренний класс, который реализует интерфейс.
Теперь мы создаем класс в отдельном пакете (папке) с внутренним классом, который реализует интерфейс:
package b;
import a.IGetResult;
public class InnterTest {
protected class GetResultImpl implements IGetResult {
@Override
String getResult() { return "result"; }
}
}
В третьем пакете наследуйте от вашего класса и внутри метода возвращайте объект защищенного внутреннего класса, повышая уровень отображения до интерфейса во время возврата
Итак, теперь мы создаем подкласс класса InnerTest
в третьем отдельном пакете:
package c;
import a.IGetResult;
import b.InnterTest;
public class InnerTestSubclass extends InnerTest {
public IGetResult getResultClass() {
//Up-casting happens automatically since GetResultImpl is sub-class of IGetResult
return new GetResultImpl();
}
}
Я набрал его вручную, но вы должны получить эту идею. Надеюсь, это поможет.
Я вижу следующие проблемы:
В ваших классах отсутствует объявление пакета <a/b/c>.
Ваш интерфейс a.IIGetResult должен быть общедоступным, иначе он не будет виден в пакете 'b'.
Соглашение Java предназначено для названия класса, которое начинается с верхнего регистра, поэтому ваш внутренний класс, которому следует придерживаться PracticeClass, должен быть назван "Inner".
У вашего внутреннего класса должен быть открытый конструктор, так что более поздний может быть вызван из класса, расширяющего PracticeClass, определенного в другом пакете.
Метод overriden inner.getResult() должен быть общедоступным (но вне темы).
Ваш класс IGetResult должен быть определен в третьем пакете (c?) И должен расширять PracticeClass (хотя я должен признать, что ваши инструкции немного запутывают меня).
Хорошо, вышеупомянутые пункты вместе с @dimoniy отвечают, и вы должны быть в порядке.
Ваш класс должен находиться внутри вашего интерфейса. Это должно быть в файле с именем IIGetResult.java
interface IIGetResult {
String getResult();
public class IgetResult implements IIGetResult{
@Override
String getResult() { return null; }
}
}