【问题标题】:import class in different directory在不同目录中导入类
【发布时间】:2014-10-04 21:36:14
【问题描述】:

其实,为了自学,我正在尝试在“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;
    ^

请教我完成这个练习,在此先感谢。

【问题讨论】:

  • 说明中没有提到任何关于目录或“a”或“b”的内容。他们只是谈论包裹。您创建的任何目录都应与您在 .java 文件中使用的包名称相对应。

标签: java interface package inner-classes


【解决方案1】:

根据报价:

在自己的包中使用至少一种方法创建一个接口。

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

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();
   }
}

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

【讨论】:

  • 另外,您需要将 package 语句放在第一行。否则会抛出错误“class, interface, or enum expected”。
【解决方案2】:

我可以看到以下问题:

  1. 您的类中缺少“package ”声明。

  2. 你的 a.IIGetResult 接口应该是公开的,否则它在 'b' 包中是不可见的。

  3. Java 约定类名以大写开头,因此您的内部类 PracticeClass 应命名为“Inner”。

  4. 您的内部类应该有一个公共构造函数,以便可以从扩展另一个包中定义的 PracticeClass 的类调用后者。

  5. 覆盖的 inner.getResult() 方法应该是公共的(但不在主题范围内)。

  6. 您的 IGetResult 类应该在第三个包中定义 (c?) 并且应该扩展 PracticeClass(尽管我必须承认您的说明对我来说有点混乱)。

将以上几点与@dimoniy 的回答一起应用,你应该没问题。

【讨论】:

    【解决方案3】:

    你的类需要在你的界面中。这需要在一个名为 IIGetResult.java 的文件中

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多