【问题标题】:Can I cast an object to class with interface(s)?我可以将对象转换为具有接口的类吗?
【发布时间】:2018-03-23 00:31:58
【问题描述】:

我有一个对象obj,我想将它转换为实现接口ToolView

class Whatever {
    View viewObj;
    Tool toolObj;
    ...
    public void setViewTool( View obj )
    {
        viewObj = obj;
        toolObj = (Tool) obj;
    }

    ...
}

我想避免创建两个对象来处理这种情况,或者每次我想调用 View 或 Tool 的实现方法时都必须强制转换。

如果可能,使用两个或更多接口时,同样的事情。我记得一种语言我可以做这样的事情View<Tool, and, others, interfaces>


示例

我认为问题的标题和第一行很清楚。但是,可能不是。

我在应用程序中显示了三个工具。一个是扩展LinearLayout,另外两个是FrameLayout。这些视图对象必须实现 Tool 接口,因为在它初始化、完成和用户做一些手势时会调用一些方法。但是,它也是一个视图,当我需要展示时,它需要调用setLayout, addView, animate 之类的东西。

澄清一下,在上面的示例中它可以正常工作。但是我必须设置两个变量来处理同一个对象,一个用于处理与视图方面相关的事情,一个用于处理工具界面。

我不能说泛型类不起作用,但我尝试过的方式却不起作用。我希望,可以创建一个类属性为private (View implements Tool) myObj;

现在,我几乎可以肯定,从另一个答案来看这是不可能的:Java - Defining a member that extends class A and implements interface B

【问题讨论】:

  • 这段代码没有意义。 为什么?而且你不能有class nothing'。您可以将class 设为通用,但为什么
  • @Elliott Frsich 已修复。类名无关紧要。
  • 只有当 obj 是 View 的实例或 View 的子类时,才能这样做。否则你不能。
  • 那么重要的是Casting 你不能只是将任何对象贬低到另一个对象。应该有一个IS A 关系。你可以创建一个泛型类。
  • 无论你写的是什么语法上是正确的,但逻辑上没有任何意义,你将一事无成。最好提供一个可以进一步澄清您的问题的场景。

标签: java android


【解决方案1】:

如果你的问题是

我知道我可以将一个对象 (A) 转换为另一个 (B),但是如果 B 类实现了一个接口 (C),我可以这样做吗?

那么答案是肯定的。它不会改变 B 类是否实现 C 的任何内容。但是对于任何对象转换,只有当 A 的实例 a 也是 B 的实例时,你才能做到这一点。你可以像这样测试它:

A a = new A()
if(a instanceof B) {
    //a is an instance of B
}

如果A的实例a也是B的实例,这意味着它实现了C。所以你可以这样做

C c = (C) a;
B b = (B) a;

【讨论】:

    猜你喜欢
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多