импортировать класс в другой каталог

1

Фактически, я пытаюсь закончить эту практику в "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;
    ^

Пожалуйста, научите меня проходить эту практику, спасибо заранее.

  • 0
    В инструкциях ничего не говорится о каталогах, о «а» или «б». Они просто говорят о пакетах. Любые создаваемые вами каталоги должны соответствовать именам пакетов, которые вы используете в файлах .java.
Теги:
interface
package
inner-classes

3 ответа

3
Лучший ответ

Согласно цитате:

Создайте интерфейс, по крайней мере, с одним методом в своем собственном пакете.

Поэтому мы создаем файл 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();
   }
}

Я набрал его вручную, но вы должны получить эту идею. Надеюсь, это поможет.

1

Я вижу следующие проблемы:

  1. В ваших классах отсутствует объявление пакета <a/b/c>.

  2. Ваш интерфейс a.IIGetResult должен быть общедоступным, иначе он не будет виден в пакете 'b'.

  3. Соглашение Java предназначено для названия класса, которое начинается с верхнего регистра, поэтому ваш внутренний класс, которому следует придерживаться PracticeClass, должен быть назван "Inner".

  4. У вашего внутреннего класса должен быть открытый конструктор, так что более поздний может быть вызван из класса, расширяющего PracticeClass, определенного в другом пакете.

  5. Метод overriden inner.getResult() должен быть общедоступным (но вне темы).

  6. Ваш класс IGetResult должен быть определен в третьем пакете (c?) И должен расширять PracticeClass (хотя я должен признать, что ваши инструкции немного запутывают меня).

Хорошо, вышеупомянутые пункты вместе с @dimoniy отвечают, и вы должны быть в порядке.

0

Ваш класс должен находиться внутри вашего интерфейса. Это должно быть в файле с именем IIGetResult.java

interface IIGetResult {
    String getResult();

    public class IgetResult implements IIGetResult{
        @Override
        String getResult() { return null; }
    } 
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню