投射到界面的能力的目的是什么?
我有那个界面
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
会有什么不同?
什么时候会使用第二个选项?
答案 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)
接口的概念是,您可以通过该接口与对象进行通信。例如,假设您有三个类。 Car
,Bus
和Truck
。这三个类实现了Vehicle
接口。而不是像以下方法:
public void doSomething(Car car) {}
public void doSomething(Bus bus) {} // etc
您可以将它们称为常用界面。
public void doSomething(Vehicle v)
这也意味着您可以插入新类,并仍然使用此方法。如果这些类实现了Vehicle
接口,则可以将它们传递给此方法,而无需更改doSomething
方法中的代码。这称为Loose Coupling,是代码中的理想功能。
示例图片:
答案 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
,那么就不要施放(这将是无用的)。