在不同的目录导入类(import class in different directory)

2019-10-20 16:30发布

其实,我想完成的“想在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;
    ^

请教我去通过这种做法,在此先感谢。

Answer 1:

按报价:

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

所以我们创建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();
   }
}

我键入它的手,但你应该明白我的意思。 希望帮助。



Answer 2:

我可以看到以下问题:

  1. 你缺少在班“包<a/b/c>”声明。

  2. 你a.IIGetResult接口应该是公开的,否则也不会在“B”包可见。

  3. Java的约定是类名以大写字母开始,从而insided PracticeClass你的内部类应该被命名为“内”代替。

  4. 你的内部类应该具有公共构造,使以后可以延长在另一个包中定义PracticeClass类调用。

  5. 在被覆盖的inner.getResult()方法应该是公共的(但外的话题)。

  6. 您的类IGetResult应在第三包中定义的(C?),并应延伸PracticeClass(虽然我必须承认你的指令是有点混乱给我)。

Aplly与@ dimoniy的答案,你沿着上述各点应该没问题。



Answer 3:

你的类必须是你的界面内。 这需要在一个名为IIGetResult.java

interface IIGetResult {
    String getResult();

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


文章来源: import class in different directory