【问题标题】:Casting class to its implemented interface将类转换为其实现的接口
【发布时间】:2013-04-11 20:32:09
【问题描述】:

强制转换为接口的目的是什么?

我有那个界面

public interface Iperson{ 
 String getTitle();
 int getID();
}

我有一个实现它的类,例如

public class Person implements Iperson{

    public Person(){...}

    @Override
    public String getTitle() {
    return 'aaa';
    }

    @Override
    public int getID() {
        return '111';
    }    
}

在另一个类中,我有一个带有签名的函数:

public boolean insert(Iperson somePerson)

somePersonPerson 的实例和somePerson(Iperson)Person 的转换时,调用insert(somePerson) 有什么区别?

什么时候会使用第二种选择?

【问题讨论】:

  • A Person 不需要强制转换为 Iperson。它一个。 Iperson 的未知实现可以转换为 Person。其结果取决于演员表是否有效。

标签: java interface casting


【解决方案1】:

语义上没有区别。当您不显式转换时,将执行隐式向上转换。

请注意,在某些情况下,可能需要显式转换来解决歧义:

public class Clazz {

    interface IOne {}
    interface ITwo {}

    static class C implements IOne, ITwo {}

    static void foo(IOne arg) {}
    static void foo(ITwo arg) {}

    public static void main(String args[]) {
        foo(new C());        // ERROR: foo is ambiguous
        foo((IOne)new C());  // OK
        foo((ITwo)new C());  // OK
    }

}

【讨论】:

    【解决方案2】:

    什么都没有。

    当你将一个对象传递给一个方法时,它会被转换为函数需要的参数类型。在这种情况下,由于您将Person 传递给insert(),因此Person 被转换为IPerson

    如果Person 没有实现IPerson,那么你不能将它传递给insert()。但是,由于Person 实现了IPerson,因此在传递给insert(IPerson) 函数时,它会隐式转换为IPesrson

    【讨论】:

      【解决方案3】:

      完全没有区别!!你可以顺便去掉演员表!! 您可以将一种 Person 或 Iperson 或任何通过“IS A”规则的对象传递给 insert 方法。因此,您可以传递另一种类型的 IPerson(例如也实现了 Iperson 的员工),甚至可以传递一种从 Person 继承的类。 将 IPerson 作为 insert 方法中的一种参数,您可以将这些类型中的任何一种传递给 insert 方法。例如,您不必只传递 Persons 类型。

      【讨论】:

        【解决方案4】:

        不同之处在于,如果不将其转换回实现类,则无法访问不在接口中但在实现类中的方法。

        【讨论】:

          【解决方案5】:

          通过方法调用public boolean insert(Iperson somePerson),您可以使用实现Interface Iperson任何 类(因此不仅仅是Person)。

          现在,当您调用insert(somePerson) 时,该方法会获得Person 的实例,但同时该实例实际上也是Iperson 的实例(可以这么说)。这样插入方法就可以使用参数somePerson 的方法和属性,这是它所期望的。如果您首先将somePerson 转换为Person,则该方法知道它可以使用Iperson 接口的所有属性,并且您在Person 中实现的所有其他内容都可以忽略(因为不需要)。

          所以基本上如果你可以调用 insert( somePerson) 而不强制转换 somePerson 然后不要强制转换(这将无用)。

          【讨论】:

            【解决方案6】:

            接口的想法是让您可以通过该接口与对象进行通信。例如,假设您有三个班级。 CarBusTruck。这三个类实现了Vehicle 接口。而不是像这样的方法:

            public void doSomething(Car car) {} 
            public void doSomething(Bus bus) {} // etc
            

            您可以将它们称为它们的通用接口。

            public void doSomething(Vehicle v)
            

            这也意味着你可以插入新的类,并且仍然使用这个方法。只要这些类实现了Vehicle 接口,就可以将它们传递给此方法,而无需更改doSomething 方法中的代码。这被称为Loose Coupling,是代码中理想的功能。

            示例图片:

            【讨论】:

              猜你喜欢
              • 2017-02-16
              • 2019-07-26
              • 2015-05-18
              • 2011-09-18
              • 2019-05-08
              • 1970-01-01
              • 1970-01-01
              • 2011-04-11
              • 1970-01-01
              相关资源
              最近更新 更多