我有一个界面
public interface IFoo {
String getX();
...
}
有几个像这样的类
public class Bar implements IFoo {
public String getX() {
...
}
public String getY() {
...
}
}
这里重要的是,实现ifoo
的所有类(如bar
)都具有String getY()
方法,但该方法不是ifoo
接口的一部分。
现在,我需要将一些XML反序列化为一个Java对象。XML可以是任何ifoo
实现类的对象,但是在反序列化之后,我将需要使用String getY()
方法。
有什么简洁或优雅的方法来实现这一点吗?
我创建了另一个界面
public interface IFooExtension extends IFoo {
String getY();
}
并尝试创建它的实例
String xml = ...;
IFooExtension fooExtension = (IFooExtension) XMLBeanSerializer.deserialize(xml);
但在将XML强制转换为对象时会出现一个错误,该错误指出Bar的object实例不能强制转换为IfooExtension
类型的对象
这在Java根本不可能。
为了将任何类X强制转换到某个接口Y,在源代码端(或者:X的父类执行此操作)中绝对必须有X实现Y
。
Java不支持“称我为Y,因为我拥有Y的所有方法”(在某种对象“是Y的实例,因为它拥有所有Y方法”的意义上)的想法。
问题内容: 显然,这会导致编译错误,因为Chair与Cat无关: 为什么当我将Cat引用转换为不相关的接口Furniture时,我只能在运行时得到一个异常,而编译器显然可以告诉Cat没有实现Furniture? 问题答案: 编译的原因 是你可能会拥有 如果创建实例,则可以将其分配给,并且可以将该实例强制转换为。换句话说,某些子类型可能会实现该接口。 在第一个例子中 除非自身从扩展,否则某些子类型不
问题内容: 在进行中,是否可以通过某种方式动态地转换变量? 例如,如果简单的转换将是: 如果我事先不知道年龄是整数怎么办?一种简单的书写方式是 有没有办法实现这样的目标?反射包提供了一些在运行时确定或强制转换类型的方法-但我找不到像上述提到的东西(适用于所有类型的通用方案)。 问题答案: 不,你不能。Go是一种静态类型的语言。变量的类型在编译时确定。 如果要动态确定的,可以使用类型切换:
null 同样的道理是什么?-理想情况下,访问子类的方式本质上是相同的-那么为什么会有这种限制呢?
显然,这会导致编译错误,因为椅子与Cat无关: 那么,为什么只有在运行时,当我将Cat引用转换到不相关的接口家具时,才会出现异常,而编译器显然可以看出Cat没有实现家具?
问题内容: 我对接口和类实现接口有疑问。 这是我的代码: 我想创建一个这样的实例: 可以,但是如何从接口实例中调用?这是安全的吗? 感谢帮助。 问题答案: 是的,就可以了(如果你改变的声明来实现),并作为参考真的很安全,只要 不 参考的实例。 但是,这通常是个坏主意。使用接口的全部目的是能够与 任何 实现一起使用- 它是将抽象与实现分开。如果你然后将需要一个具体的实现,你还不如让的类型正好与开始。
问题内容: 我很好奇为什么Go 不会隐式转换为,而Go 会隐式转换为。我缺少这种转换的重要内容吗? 例: 抱怨 不能在函数参数中使用(类型[]字符串)作为类型[] interface {} 如果我尝试明确执行此操作,则会遇到同样的事情:抱怨 无法将(类型[]字符串)转换为类型[] interface {} 因此,每次我需要进行这种转换时(这似乎很多),我一直在做这样的事情: 是否有更好的方法来执行