将类转换为其实现的接口

时间:2013-04-11 20:32:10

标签: java interface casting

投射到界面的能力的目的是什么?

我有那个界面

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)somePerson的实例且Person是一个已投标somePerson时,调用(Iperson)Person会有什么不同?

什么时候会使用第二个选项?

6 个答案:

答案 0 :(得分:2)

从语义上讲,没有区别。如果不显式转换,则会执行隐式向上转换。

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

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
    }

}

答案 1 :(得分:1)

绝对没有。

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

如果Person未实施IPerson,则您无法将其传递给insert()。但是,由于Person实现了IPerson,因此在将IPesrson函数传递给insert(IPerson)时会隐式转换为{{1}}。

答案 2 :(得分:0)

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

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

您可以将它们称为常用界面。

public void doSomething(Vehicle v)

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

示例图片:

enter image description here

答案 3 :(得分:0)

绝对没有区别!!你可以顺便删除演员! 您可以将一种Person或Iperson类型或任何传递“IS A”规则的对象传递给insert方法。因此,您可以传递另一种类型的IPerson(例如也实现Iperson的员工),甚至是一种继承自Person的类。 将IPerson作为插入方法中的一种参数,可以将任何这些类型传递给insert方法。例如,您没有义务只传递Persons类型。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

所以基本上如果你可以在没有施放insert( somePerson)的情况下调用somePerson,那么就不要施放(这将是无用的)。