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)場合の呼び出しの違いは何ですか?somePersonPersonsomePerson(Iperson)Person

そして、いつ2番目のオプションを使用しますか?

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

何もない。

オブジェクトをメソッドに渡すと、関数が必要とする引数の型にキャストされます。この場合、 to を渡すためPersoninsert()Person は としてキャストされますIPerson

Personが実装されていない場合はIPerson、 に渡すことができませんでしたinsert()。ただし、 をPerson実装しているため、関数に渡されるIPersonと暗黙的に an にキャストされます。IPesrsoninsert(IPerson)

于 2013-04-11T20:34:10.283 に答える
0

インターフェイスの考え方は、そのインターフェイスを介してオブジェクトと通信できるようにすることです。たとえば、3 つのクラスがあるとします。CarBusおよびTruck。これら 3 つのクラスは、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」ルールを渡す任意のオブジェクトを渡すことができます。したがって、別のタイプの IPerson (たとえば、Iperson も実装する従業員) や、Person から継承するタイプのクラスを渡すことができます。挿入メソッドの引数の型として IPerson を使用すると、これらの型のいずれかを挿入メソッドに渡すことができます。たとえば、 Persons タイプのみを渡す必要はありません。

于 2013-04-11T20:37:27.643 に答える