其实,我想完成的“想在Java中”自我学习的目的这种做法 -
练习6:(2)与至少一种方法创建的接口,在其自己的封装件。 在一个单独的包中创建一个类。 添加一个实现该接口的受保护的内部类。 在第三个包,从你的类继承和,一种方法内,返回受保护的内部类的对象,则返回期间向上转型到接口。
所以我创建了一个名为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的一个/ 的.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的约定是类名以大写字母开始,从而insided PracticeClass你的内部类应该被命名为“内”代替。
你的内部类应该具有公共构造,使以后可以延长在另一个包中定义PracticeClass类调用。
在被覆盖的inner.getResult()方法应该是公共的(但外的话题)。
您的类IGetResult应在第三包中定义的(C?),并应延伸PracticeClass(虽然我必须承认你的指令是有点混乱给我)。
Aplly与@ dimoniy的答案,你沿着上述各点应该没问题。
你的类必须是你的界面内。 这需要在一个名为IIGetResult.java
interface IIGetResult {
String getResult();
public class IgetResult implements IIGetResult{
@Override
String getResult() { return null; }
}
}