2013-04-11 76 views
0

能夠接口轉換的目的是什麼?對其實施接口的鑄造類

我有接口

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)somePersonPerson一個實例,並在somePerson是鑄造(Iperson)Person的區別是什麼?

什麼時候會使用第二個選項?

+6

一個'Person'不需要轉換成'Iperson'。它*是*一個。然而,一個未知的'Iperson'實現可以轉換爲'Person'。其結果取決於演員是否有效。 – 2013-04-11 20:33:33

回答

1

絕對沒有。

當您將一個對象傳遞給方法時,它將轉換爲該函數所需的參數類型。在這種情況下,因爲你通過了Personinsert(),那麼這個人就是IPerson

如果Person沒有執行IPerson,那麼你不能將它傳遞給insert()。但是,由於Person實現了IPerson,因此它在傳遞給insert(IPerson)函數時隱式轉換爲IPesrson

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 
    } 

} 
0

接口的思想是你可以通過接口與對象進行通信。例如,假設您有三個班級。 CarBusTruck。這三個類實現了Vehicle接口。而不是像這樣的方法:

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

您可以將它們稱爲它們的通用接口。

public void doSomething(Vehicle v) 

這也意味着你可以插入新的類,並仍然使用這種方法。只要這些類實現了接口,就可以將它們傳遞給此方法,而無需更改doSomething方法中的一小部分代碼。這被稱爲Loose Coupling,並且是代碼中的一個理想功能。

示例圖像:

enter image description here

0

是絕對沒有差別!!你可以通過這種方式移除演員! 您可以向插入方法傳遞一種Person或Iperson或任何傳遞「IS A」規則的對象。因此,您可以傳遞另一種類型的IPerson(例如也實現Iperson的員工),甚至可以傳遞一種從Person繼承的類。 將IPerson作爲insert方法中的一個參數類型讓您將任何這些類型傳遞給insert方法。例如,您沒有義務僅傳遞人員類型。

0

不同之處在於,您不能訪問不在接口中但在實現類中的方法,而無法將其重新轉換回實現類。

0

與方法調用public boolean insert(Iperson somePerson)你可以使用實現Interface Iperson(這樣不僅Person任何類。

現在,當您呼叫insert(somePerson)該方法得到一個Person的實例,但同時該實例實際上也是Iperson(可以這麼說)的一個實例。因此,插入方法可以使用它所期望的參數somePerson的方法和屬性。如果您將somePerson首先轉換爲Person,則該方法知道它可以使用Iperson接口的所有屬性,並且您在Person中實現的每個附加內容都可以忽略(因爲它不是必需的)。

所以基本上如果你可以不用鑄造而是鑄造somePerson那麼就不要鑄造(這是沒用的)。