18

在 C# 中,如果您有两个具有相同方法的基本接口(例如 F()),您可以使用显式实现来执行不同的 impl。对于 F()。这使您可以区别对待对象,对应于当前的观点:作为 IMyInterface1 或 IMyInterface2。这在Java中可能吗?

4

4 回答 4

31

不,没有什么能比得上 C# 在 Java 中的显式接口实现。

从好的方面来说,Java 有协变的返回类型,所以如果你想提供比接口指定的更强类型的实现,那没关系。例如,这很好:

interface Foo
{
    Object getBar();
}

public class Test implements Foo
{
    @Override
    public String getBar()
    {
        return "hi";
    }
}

C# 不允许这样做(在 C# 9 之前,现在支持协变返回类型) - 解决它的一种方法通常是显式实现接口,然后使用更具体的公共方法(通常由接口实现调用) .

于 2009-02-21T19:45:45.580 回答
4

使用 Java 中的匿名接口实现机制也可以达到类似的效果。

参见示例:

interface Foo {

    void f();
}

interface Bar {

    void f();
}

public class Test {

    private String foo = "foo", bar = "bar";

    Foo getFoo() {
        return new Foo() {

            @Override
            public void f() {
                System.out.println(foo);
            }
        };
    }

    Bar getBar() {
        return new Bar() {

            @Override
            public void f() {
                System.out.println(bar);
            }
        };
    }

    public static void main(String... args) {
        Test test = new Test();
        test.getFoo().f();
        test.getBar().f();
    }
}
于 2012-09-28T15:15:43.213 回答
0

只有在方法重载时才能执行此操作。如果您有两种方法可以做不同的事情,恕我直言,它们应该有不同的名称。

于 2009-02-21T19:54:04.780 回答
-17

不,它不应该出现在 Java 中。这只是扔给那些对优秀设计不屑一顾的人的另一块骨头。

永远不应该需要或使用接口的显式实现。有更好的方法来解决这个试图解决的问题。

于 2010-05-21T04:20:52.460 回答