5

以下のコードを検討してください。

public class Test{
  public static void main(String str[]){
     B b = new B();
     A a1 = (A)b;//Explicit type conversion
     A a2 = b;
  }
}
class A{}
class B extends A{}

上記のコードには次の 2 行があります。

A a1 = (A)b;//Explicit type conversion
A a2 = b;

同等?そうでない場合は、2 つの違いは何ですか。そうである場合、サブクラス オブジェクトを明示的にスーパー クラス オブジェクトに変換する必要があるJava のシナリオはありますか?

4

6 に答える 6

10

オブジェクトではなく参照の明示的な型キャスト) は冗長であり、一部の IDE では削除するよう提案されます。

もしあなたがそうするなら

A a1 = (A)b;

あなたはまだできる

B b2 = (B) A;

参照を B の型にキャストし直します。

注: オブジェクトは決して変更されず、常にB

あなたがそれを必要とするJavaにはシナリオはありませんか?

アップキャストが必要になるのは、メソッドの選択時だけです。

void method(Object o) { }

void method(String s) { }

method("hello");          // calls method(String)
method((Object) "hello"); // calls method(Object)
于 2012-10-11T16:10:06.000 に答える
3

このような型変換は、オーバーロードを使用したメソッド選択にも必要です。

package casting;
public class ImplicitCasting {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        A a1 = new B();
        methodA(a);      // methodA called
        methodA((A)b);   // methodA called
        methodA(b);      // methodB called
    }

    public static void methodA(A a) {
        System.out.println("methodA called");
    }

    public static void methodA(B b) {
        System.out.println("methodB called");
    }
}

class A{

}

class B extends A{

}       
于 2012-10-12T07:17:05.857 に答える
1

両者に違いはありません。実際、型キャストを明示的に行う必要はありませんfrom a subclass object to a super class reference。したがって、最初の方法は絶対Redundantです。

JLSから- 変換: -

5.1.5. 拡張参照変換

S が T のサブタイプ (§4.10) である場合、任意の参照型 S から任意の参照型 T への拡大参照変換が存在します。

拡張参照変換は、実行時に特別なアクションを必要としないため、実行時に例外をスローすることはありません。それらは、コンパイル時に正しいと証明できる方法で参照を他の型を持つと見なすだけです。

明示的な型キャストは、参照型が を格納できることが明らかでない場所でのみ必要ですobject。しかし、サブクラスのオブジェクトを作成し、スーパークラスの参照をそのオブジェクトを指すようにすると、コンパイラは決して問題になりません。それはいつでも実行時に処理できるためです。

于 2012-10-11T16:08:35.827 に答える
1

同等?そうでない場合、2つの違いは何ですか

唯一の違いは、一方が暗黙的であり、他方が明示的であることです (これは必須ではありません)。結果は同等です。注: キャストは、オブジェクト自体ではなく、オブジェクトへの参照に対して機能します。

サブクラスオブジェクトをスーパークラスオブジェクトに明示的に変換する必要があるJavaのシナリオはありますか?

Java はLiskov 置換原則をサポートしているため、そのようなシナリオは存在しないはずです。

于 2012-10-11T16:13:26.400 に答える
1

あなたの例では、それらは同等ではありません。

これは、別の方法で代入する場合に重要になります。つまり、オブジェクトがまだ型である間にfrom からAto へBB

たとえば、以下のシーケンスを検討してください。

      A a = b;// will work
      a = (A)b;// will work
      B newB = (B)a; //will work
      B newB = a;  //will fail
于 2012-10-11T16:07:13.097 に答える
0

どちらも同じです。これは、自動の下向き型キャストのケースです。

A a1 = (A)b;//明示的な型変換 A a2 = b;

どちらの場合も、a1 と a2 のタイプは A です。したがって、B の追加の特性はとにかく失われます。

自動ではない上向きの型キャストを行うと、違いがわかります。次の例を検討してください。

車両 v1 = 新しい車(); //右 。アップキャストまたは暗黙のキャスト

車両 v2= 新しい車両();

車 c0 = v1; // 間違ったコンパイル時エラー "Type Mismatch" //明示的またはダウンキャストが必要です Car c1 = (Car) v1 // そうです。ダウンキャストまたは明示的なキャスト。v1 は 1 行目により Car の知識を持っています

車 c2= (車) v2; //間違った実行時例外 ClassCastException v2 には Car の知識がないためです。

バス b1 = 新しい BMW(); //間違ったコンパイル時エラー「型の不一致」

車 c3 = 新しい BMW(); //右。アップキャストまたは暗黙のキャスト

車 c4 = (BMW) v1; // 間違った実行時例外 ClassCastexception

オブジェクト o = v1; //v1 はその親 Car c5 = (Car) v1 にのみアップキャストできます。// v1 は 1 行目により Car にダウンキャストできます

于 2012-10-11T16:36:26.343 に答える