【问题标题】:Using Interfaces within classes in Java在 Java 中的类中使用接口
【发布时间】:2013-10-23 22:23:50
【问题描述】:

我正在努力解决 Java 的问题。如何使用 giveCode() 方法返回对象的整数值。这是我们的讲师预先编写的代码,我们必须使用它来为对象返回一个整数值,在为哈希表创建哈希值时使用它。

HashCode.java

// Interface for HashCode. Has only one method declaration
public interface HashCode {

    // For an input object, computes and returns its HashCode as an integer
        public int giveCode(Object o);

}

StringHashCode.java(我创建了这个类,因为我们应该在这个类中实现 HashCode 类)

public abstract class StringHashCode implements HashCode{


} 

我在我的 main 中尝试过这样的事情,只是为了简单地返回代码值,所以我可以看到它是如何工作的,但似乎没有任何工作:

System.out.println(new StringHashCode.giveCode(example_object));

或者

System.out.println(new StringHashCode.giveCode(example_object.hashCode()));

或者

System.out.print(HashCode.giveCode(example_object));

我对 Java 很陌生,但是我对其他 OOP 语言有很多经验,但我似乎无法理解这个问题,我觉得这可能是一些愚蠢的事情,但我不能猜一猜。

【问题讨论】:

  • 不工作是什么意思?您的期望和实际结果是什么?
  • 你不能创建抽象类的实例。你需要一个具体的类。您的示例甚至无法编译。我建议你写一些代码先编译。
  • 您缺少两个非常重要的字符,称为括号:new StringHashCode()

标签: java class oop interface


【解决方案1】:
  1. 使类非抽象
  2. 编写方法实现
  3. 你缺少括号

解决这些问题,它会更好地为您服务。

 public class StringHashCode implements HashCode{

    public int giveCode(Object o) {
        return o.hashCode(); // Replace this with your own implementation
    }
} 


System.out.println(new StringHashCode().giveCode(example_object));

【讨论】:

  • giveCode 部分不是我所知道的方法,它只是一个用对象的整数值声明的变量。还。返回 42 是没有用的,因为返回的代码应该是唯一的。
  • @ConnerStephenMcCabe GiveCode 部分 OP 问题中HashCode 接口中的一个方法。它绝对不是变量。当然,返回 42 是没有用的,它原本是作为 // TODO: Replace with your own implementation 的,但我现在改变了它以使用更有意义的实现。
  • @ConnerStephenMcCabe 对不起,现在才意识到你是 OP。是什么让您认为 giveCode-"thingy" 不是一种方法?当它在接口中以这种方式声明时,它指定接口的所有实例都必须包含该方法。
【解决方案2】:
  1. 您试图在不使用 () 的情况下实例化类。你会想要new StringHashCode()
  2. 您正在尝试实例化一个抽象类,这是不可能的。
  3. 你没有在任何地方实现 giveCode 方法,所以自然不能调用它。

【讨论】:

    【解决方案3】:

    既然你的讲师给了你那个接口,你就必须实现它。那可能是一堂课。它可以是您可能不需要的另一个接口,抽象类对您的解决方案没有用处,因此请使用简单类并实现该接口。

    class HashCodeImpl implements HashCode {
        @Overwide
        public int getCode(Object obj) {
            return obj.hashCode();
        }
    }
    

    在main方法中,这个类应该被用作

    class Main {
        public static void main(String[] args){
            HashCodeImpl impl = new HashCodeImpl();
            System.out.println(impl.getCode(new String()));
        }
    }
    

    现在在你的问题中,我不知道你是如何没有得到任何输出的,因为你的系统都不会编译。

     System.out.println(new StringHashCode.giveCode(example_object));
    

    这个类的giveCode方法不是静态的,所以不会编译

     System.out.println(new StringHashCode.giveCode(example_object.hashCode()));
    

    同样的原因 giveCode 不是静态的,所以它不会编译,你必须传入一个对象和类,假设返回有代码。在这种情况下,您将哈希码传递给方法。

     System.out.print(HashCode.giveCode(example_object));
    

    编译错误,因为 HashCode 是一个类似于原型的接口,您必须实现它才能创建具体类。

    【讨论】:

    • 哈哈,我收集到了。我一直遇到的问题是,当我将类设为非抽象类时,它告诉我该类需要是抽象的或重写的。但即使我添加了你的覆盖,它也会告诉我同样的事情,并给我一个覆盖错误。
    • @ConnerStephenMcCabe 对于覆盖,返回类型和参数类型必须完全相同(除了此处不适用的协方差)。您是否尝试使用声明为 exactlypublic int giveCode(Object o) 的内容进行覆盖?附言貌似回答者拼错了getCode,所以如果你剪切粘贴,那就错了。
    • @ajb Derp,感谢您的提醒,这解决了问题,哈哈!在假设它不起作用之前应该彻底检查代码。干杯。
    • @user2880879 您的答案的上半部分是正确的,但您对为什么 System.out.println 的三个不同行不起作用的原因不正确。
    猜你喜欢
    • 2012-08-27
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多