Java 如何将接口变量分配给子接口变量?

Java 如何将接口变量分配给子接口变量?,java,interface,instance,Java,Interface,Instance,我有以下接口: public interface Interface { int functionOne(); } public interface SubInterface extends Interface { String functionTwo(); } 这门课: public class MyClass implements SubInterface { ... } 现在问题来了: Interface a = new MyClass(); SubInter

我有以下接口:

public interface Interface {   
    int functionOne(); 
}

public interface SubInterface extends Interface {
    String functionTwo();
}
这门课:

public class MyClass implements SubInterface {
...
}
现在问题来了:

Interface a = new MyClass();
SubInterface b = a;

我想将a正在寻址的MyClass实例分配给变量b。我不想创建一个相同的实例,只需将现有实例的地址从a传输到b,但如果我这样做,netbeans会给我一个关于不兼容类型的错误。如何操作?

当前,您的代码将无法编译,因为
a
属于
Interface
类型,并且不能分配给
SubInterface
类型的变量。因此,您需要执行以下操作:

SubInterface b = (MyClass)a;
如果你仔细想想;这是完全有意义的,因为并非所有实现类型的
接口
都实现
子接口

如果您不知道实现类的实际类型,则可以执行以下操作:

SubInterface b = (SubInterface) a;

这样更安全

您不能这样做,因为接口不一定是子接口。编译器不知道它实际上是一个MyClass实例,所以我们知道一些它不知道的东西。在这种情况下,您可以安全地将变量A的值强制转换为正确的类型。强制转换为子接口将更好,无需假设更多。@NickL,在这种情况下,正如我们所知,
A
实际上是
MyClass
类型,但肯定,我还将推荐另一种解决方案。虽然代码现在可以正常工作,但其危害来自代码的可进化性。您无法再安全地将实现更改为
子接口
的另一个子类(这样做时编译器将不会帮助您)。实际上,一开始就没有理由强制转换到
MyClass
,因为它会立即升级到
SubInterface
。因此,这可能导致的唯一问题是将来可能出现不必要的
ClassCastException