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)
请教我通过这个练习,在此先感谢。
根据报价:
在它自己的包中创建一个具有至少一种方法的接口。
所以我们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)
我是手写的,但你应该明白了。希望有帮助。