导入不同目录下的类

sha*_*nwu 5 java interface package inner-classes

实际上,为了自学目的,我正在尝试在“Think in Java”中完成此练习-

练习 6:(2)在它自己的包中创建一个具有至少一种方法的接口。在单独的包中创建一个类。添加一个实现接口的受保护的内部类。在第三个包中,从您的类继承,并在方法内部返回受保护内部类的对象,并在返回期间向上转换到接口。

所以我在目录“a”下创建了一个名为 IgetResult.java 的类,它有一个 IIGetResult 接口。

interface IIGetResult {
    String getResult();
}
public class IgetResult {
} 
Run Code Online (Sandbox Code Playgroud)

然后我在另一个目录中创建另一个类——目录 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");
    }

}
Run Code Online (Sandbox Code Playgroud)

在最后一步,我使用命令编译两个 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;
    ^
Run Code Online (Sandbox Code Playgroud)

请教我通过这个练习,在此先感谢。

dim*_*niy 6

根据报价:

在它自己的包中创建一个具有至少一种方法的接口。

所以我们IGetResult.java在文件夹中创建文件a

package a;

public interface IGetResult {
    String getResult();
}
Run Code Online (Sandbox Code Playgroud)

在单独的包中创建一个类。添加一个实现接口的受保护的内部类。

现在我们在一个单独的包(文件夹)中创建一个类,内部类实现了接口:

package b;
import a.IGetResult;

public class InnterTest {
   protected class GetResultImpl implements IGetResult {
       @Override
       String getResult() { return "result"; }
   }

} 
Run Code Online (Sandbox Code Playgroud)

在第三个包中,从您的类继承,并在方法内部返回受保护内部类的对象,在返回期间向上转换到接口

所以现在我们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();
   }
}
Run Code Online (Sandbox Code Playgroud)

我是手写的,但你应该明白了。希望有帮助。