2

转换为接口的能力的目的是什么?

我有那个界面

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)

insert(somePerson)调用when somePersonis an instancePerson和 when somePersonis a casted有什么区别(Iperson)Person

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

4

6 回答 6

3

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

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

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
    }

}
于 2013-04-11T20:34:03.430 回答
2

绝对没有。

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

如果Person没有实现IPerson,那么你无法将它传递给insert(). 但是,由于Personimplements ,它在传递给函数时IPerson被隐式转换为 a 。IPesrsoninsert(IPerson)

于 2013-04-11T20:34:10.283 回答
0

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

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

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

public void doSomething(Vehicle v)

这也意味着您可以插入新类,并且仍然使用此方法。只要这些类实现了Vehicle接口,就可以将它们传递给该方法,而无需更改方法中的一丁点代码doSomething。这被称为松耦合,是代码中的一个理想特性。

示例图像:

在此处输入图像描述

于 2013-04-11T20:36:44.230 回答
0

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

于 2013-04-11T20:37:27.643 回答
0

不同之处在于您不能访问不在接口中但在实现类中的方法,而无需将其转换回实现类。

于 2013-04-11T20:39:33.343 回答
0

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

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

因此,基本上,如果您可以insert( somePerson)在不强制转换的情况下调用,somePerson那么就不要强制转换(这将无用)。

于 2013-04-11T20:39:47.503 回答