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
。