实际上,我正试图在#34; Think in Java"用于自学目的 -
练习6:(2)在自己的包中创建一个至少包含一个方法的接口。创建一个 在一个单独的包中的类。添加一个实现接口的受保护内部类。在一个 第三个包,继承自您的类,并在方法内返回一个对象 受保护的内部类,在返回期间向上转换为接口。
所以我在目录" a"下创建了一个名为IgetResult.java的类。它有一个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 :(得分: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>'你班上的宣言。
您的a.IIGetResult界面应该是公开的,否则它不会在' b'中显示出来。封装
Java约定用于以大写字母开头的类名,因此你的内部类中的PracticeClass应命名为' Inner'代替。
您的内部类应该有一个公共构造函数,以便可以从另一个包中定义的扩展PracticeClass的类中调用后者。
重写的inner.getResult()方法应该是公开的(但是在主题之外)。
你的班级IGetResult应该在第三个包(c?)中定义,并且应该扩展到PracticeClass(虽然我必须承认你的指示对我来说有点混乱)。
以上几点和@ dimoniy的答案一致,你应该没问题。
答案 2 :(得分:0)
您的课程需要在您的界面内。这需要位于名为IIGetResult.java的文件中
interface IIGetResult {
String getResult();
public class IgetResult implements IIGetResult{
@Override
String getResult() { return null; }
}
}