以接口作为参数的方法

时间:2013-10-24 01:28:45

标签: java

class Do{
    void doit(){
        ClassA a = new ClassA();
        a.doSomething(>>>CODE HERE<<<);
    }
}
interface InterfaceA{
    void doSomethingElse();
}
class ClassA{
    void doSomething(InterfaceA f){
    }
}

问题: 完成上面的代码,以便doit方法打印“Hello world!” 通过仅在括号中添加代码来表示并且不改变任何其他内容。

有人可以帮我解决这个问题吗?我仍然没有任何线索。 我昨天在测验中留下了空白:((感谢您的帮助)

3 个答案:

答案 0 :(得分:4)

class Do{
    void doit(){
        ClassA a = new ClassA();
        a.doSomething(new InterfaceA () {
             { System.out.println("Hello world"); }
             @Override public void doSomethingElse() { }
             });
    }
}

关键是使用初始化程序定义匿名类,然后使用“new”创建该类的新对象。创建对象会执行初始化程序。附:这已经过测试。

这似乎不是一个好的测验问题;做这样的事情是非常模糊的,可能不是人们实际编码的正常事情。它看起来更像是一个拼图而不是一个实际的测试问题。除非有更好的答案,否则我没有发现......

答案 1 :(得分:1)

好的,如果测验问题如下:

class Do{
    void doit(){
        ClassA a = new ClassA();
        a.doSomething(>>>CODE HERE<<<);
    }
}
interface InterfaceA{
    void doSomethingElse();
}
class ClassA{
    void doSomething(InterfaceA f){
        // NOTE THIS CHANGE!
        f.doSomethingElse();
    }
}

然后你可以改变这个:

a.doSomething(>>>CODE HERE<<<);

对此:

a.doSomething(new InterfaceA() {
    @Override public void doSomethingElse() {
        System.out.println("Hello world!");
    }
});

否则答案就像其他答案所说的那样奇怪。

答案 2 :(得分:0)

我不知道这是否是测验的预期答案,但这应该有效:

class Do{
    void doit(){
        ClassA a = new ClassA();
        a.doSomething(null); System.out.println("Hello world!");
               //    ^ starting paren           closing paren ^
    }
}
interface InterfaceA{
    void doSomethingElse();
}
class ClassA{
    void doSomething(InterfaceA f){
    }
}

基本上只需将两行放在同一行上,就不必为接口提供实现。唯一添加的代码是null); System.out.println("Hello world!"

灵感来自:http://xkcd.com/327/

除非你的老师试图和你玩得开心,否则这可能更像是一个谜语般的答案。除非你的老师试图和你玩得开心。