当前位置: 首页 > 知识库问答 >
问题:

如何转换为成员不在接口中的多态类型

轩辕炎彬
2023-03-14

我有一个界面

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类型的对象

共有1个答案

史涵育
2023-03-14

这在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 {} 因此,每次我需要进行这种转换时(这似乎很多),我一直在做这样的事情: 是否有更好的方法来执行