我试图检查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因钻石问题而停止多次扩展。)
答案 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();
Test
和Test2
?实现Test
和Test2
接口时,(隐式)静态MyTest
类仍然是Test
和Test2
接口的内部类,而不是实施者AllTest
类。只是如果没有名称冲突,你也可以通过AllTest
类来引用它们。
打个比方:如果一个超类有一个公共静态字段,那么一个子类可以引用它,好像它就是它自己的,但它仍然属于超类。
答案 1 :(得分:2)
我的问题应该是它的解决方案
AllTest.MyTest test = new AllTest.MyTest();
应该是
Test.MyTest test = new Test.MyTest();
或
Test2.MyTest test = new Test2.MyTest();
为什么java允许它出现?
我真的没有看到问题。如上所示,有一个简单的解决方法。