2

同僚が私に質問をしてきましたが、私自身は最終的な答えを見つけることができませんでした。その質問はオブジェクトのキャストに関するものです。

クラス A と Factory クラスがあるとします。Factory クラスでは、A インスタンスを作成します。

Public class Factory {

    public A createA1() {
       Object instance = get_A_Object();
       //Single casting
       return (A) instance;
    }

     public A createA2() {
       Object instance = get_A_Object();
       // Duplicate casting or more
       return (A) (A) instance;
    }
}

私の質問は:

メソッド createA1() での単一キャストとメソッド createA2() での重複キャストの違いは何ですか? 彼らはいつも同じ結果を得ますか?

編集:

明確にするために、同僚が次のコード行について尋ねてきました。

org.omg.CORBA_2_5.ORB orb = ((org.omg.CORBA_2_5.ORB)org.omg.CORBA.ORB.init((String[])localObject2, localProperties)); 
return (org.omg.CORBA_2_5.ORB)(org.omg.CORBA_2_5.ORB)(org.omg.CORBA_2_5.ORB)(org.omg.CO‌​RBA_2_5.ORB)(orb);
4

7 に答える 7

5

その複製は完全に冗長です。キャストする必要があるのは1回だけです。

これが演習です。これをIDEにロードし、キャストを1つずつ削除すると、どの時点でタイプについて不平を言い始めますか?

実際、修正された質問では、キャストする必要はまったくありません。

org.omg.CORBA_2_5.ORB orb = ((org.omg.CORBA_2_5.ORB)org.omg.CORBA.ORB.init((String[])localObject2, localProperties));

orb割り当てでのタイプを宣言しました。

于 2012-09-25T10:19:07.380 に答える
2

変わりはない。

int i = (int)(int)1 

(int)1から1に評価されます。

完全に冗長。

編集: 質問とは無関係ですが..キャストする必要はありません。あなたのファクトリーは少なくともインターフェースを返す必要があります。コードの臭いのようです。

于 2012-09-25T10:19:49.843 に答える
1

基本的に、キャストに対してキャストを実行しています。

Object obj = (Object)(Integer)thing.getObeject()

基本的に、キャスト後にリキャストすることができます-私に言わせればかなり無意味です。

または、次のようなさらに厄介なもの:

Integer integer1 = (Integer)(Object)thing.toString()
于 2012-09-25T10:19:50.163 に答える
1

機能的には同じに見えるので、二重キャストは冗長だと思います。

バイトコードの奥深くにあるものかもしれませんが、コンパイラは非常に効率的であるため、何もないと思います。以下のテストは、機能的には同じであることを示しています

@Test
public void testCasting {

    Object obj = new String("abc");

    String s1 = (String) obj;
    String s2 = (String)(String)  obj;

    assertEquals("abc", s1);
    assertEquals("abc", s2);
    assertEquals(s1, s2);
}

このテストはパスします

于 2012-09-25T10:20:28.007 に答える
1

その冗長性

        Number num = (Number)(Number) (new Integer(10));

整数を Number に 2 回キャストします。違いはありません

于 2012-09-25T10:21:54.190 に答える
1

このように考えるだけで、

あなたは1つのオブジェクトをキャストしました

(A)オブジェクト

obj が A クラス型になったので、もう一度キャストする必要はありません。たとえキャストしても害はなく、プロセスが無駄になります。

于 2012-09-25T10:47:52.033 に答える
1

Java 言語仕様の観点からは、次のようになります。

instance– 型の式Object

(A) instance– 型の式A

(A) (A) instanceA– type の式をtype にキャストしAます。

それを明確にする別の方法は、次のコードと比較することです。

final Object instance = get_A_Object();
final A a = (A) instance;
final A a0 = (A) a;
于 2012-09-25T11:14:21.167 に答える