钻石出现在java中

时间:2014-08-25 11:40:16

标签: java inheritance

我试图检查Java接口允许的java接口我得到了一些结果

我很惊讶它允许java中的内部类。因此我们可以轻松生成钻石问题。即使java已经照顾它了。

我所做的是。

MainInterface.java

public interface MainInterface {


class MyTest{

        public MyTest(){
            System.out.print("AAAA");
        }
    }
}

Test.java(接口)

public interface Test extends MainInterface{
public void abc();

class MyTest{

    public MyTest(){
        System.out.print("AAAA");
    }
}
}

Test2.java(接口)

public interface Test2 extends MainInterface{

class MyTest {

    public MyTest() {
        System.out.print("BBBB");
    }
}
}

已实施课程

public class AllTest implements Test,Test2{

    public void abc() {

    }

}

主要类

public class Main {

    public static void main(String[] args) {

        AllTest.MyTest test = new AllTest.MyTest();// at this line it conflict.
    }

}

我的问题应该是什么解决方案?   2)为什么java允许它成为?(因为我们都知道java因钻石问题而停止多次扩展。)

2 个答案:

答案 0 :(得分:3)

接口中的内部类隐式static(就像方法隐式public一样,即使您不使用public关键字)。

话虽如此,没有冲突,您可以通过将它们称为:

来简单地实例化它们。
new InterfaceName.InnerClassName();

// No error because InnerClassName is static
// And no instance of the "InterfaceName" is required.

或者,如果您导入内部类:

import com.somepackage.InterfaceName.InnerClassName;

...

// Imported, you can simply:
new InnerClassName();

为什么可以同时实施TestTest2

实现TestTest2接口时,(隐式)静态MyTest类仍然是TestTest2接口的内部类,而不是实施者AllTest类。只是如果没有名称冲突,你也可以通过AllTest类来引用它们。

打个比方:如果一个超类有一个公共静态字段,那么一个子类可以引用它,好像它就是它自己的,但它仍然属于超类。

答案 1 :(得分:2)

  

我的问题应该是它的解决方案

AllTest.MyTest test = new AllTest.MyTest();

应该是

Test.MyTest test = new Test.MyTest();

Test2.MyTest test = new Test2.MyTest();
  

为什么java允许它出现?

我真的没有看到问题。如上所示,有一个简单的解决方法。