-1

プロトタイプデザインパターンを勉強しています。以下の構文が理解できません。説明してもらえますか?クラスが括弧で囲まれ、次のように初期化されるとはどういう意味ですか?

Person person2 = (Person) person1.doSomthing();

コンテキスト内のコード:

// code in  int main
Person person1 = new Person("Fred");// this is understood
    System.out.println("person 1:" + person1);// this is understood
    Person person2 = (Person) person1.doClone();//not understood
    System.out.println("person 2:" + person2);// this is understood

この構文はJavaのキャスト用ですか?

4

6 に答える 6

9

キャストです。言い換えると、doSomething()メソッドは、を返すように宣言されていない可能性がありPersonます。Personしたがって、に割り当てる前に、まず戻り値をにキャストする必要がありますperson2

doSomethingがを返す場合Person、キャストは必要ありません。

また、によって返されるオブジェクトの実際のタイプがdoSomethingPersonに割り当てられない場合、キャストはClassCastException実行時にをスローします。

JLS#15.16でそれについてのより多くの情報:

キャスト式は、実行時に、ある数値型の値を別の数値型の同様の値に変換します。または、コンパイル時に、式の型がブール値であることを確認します。または、実行時に、参照値が、指定された参照型と互換性のあるクラスを持つオブジェクトを参照していることを確認します。

括弧とそれに含まれるタイプは、キャスト演算子と呼ばれることもあります。

于 2012-08-22T15:40:08.407 に答える
4

これは型キャストと呼ばれます。あなたが言っているのは、JVMがその呼び出しによって返されるオブジェクトのタイプを強制的に。にしようとすることを確実にしたいということですPerson

assyliasが言及していないもう1つの点は、これには2つの追加機能があることです。

  1. 実際に返されるオブジェクトがのサブクラスである場合Person、戻り値はに変更されますPerson。これは、サブクラスが実際に使用されていることを確認したい場合に便利です。うまくいけば、のように動作しますPerson
  2. がインターフェイスの場合Person、その特定の実装の継承階層の外に出て、他の誰かのPerson実装を使用できるようになります。これは、セキュリティ構成などでクラスをチェーン化する方法をビルド時に構成できるSpringなどのAPIで使用するのに最適です。
于 2012-08-22T15:40:59.560 に答える
2

単にタイプにキャストするために使用されます(person1.doSomthing()Person。型を返さないかもしれませんが、Person型にキャストできるものだからPersonです。

于 2012-08-22T15:39:41.430 に答える
1

Person.doClone()の結果もタイプにキャストしていますPerson。おそらく、または同様のものPerson.doClone()を返します。Object

于 2012-08-22T15:40:20.343 に答える
1
Person person2 = (Person) person1.doSomthing();

Objectがperson1.doSomthing()から返すPerson型への型キャスト。

Person person2 = (Person) person1.doClone();

ここでは、person1オブジェクトのクローンを作成してpersonオブジェクトにキャストします。

于 2012-08-22T15:43:12.133 に答える
1

これは型キャストであり、呼び出しから返されるオブジェクト型が型であることを確認してperson1.doClone()Personperson2変数に割り当てることができるようにします。

doClone()メソッドがクラスで定義されている場合Person、タイプがオブジェクトを返すことを期待しますPerson。このシナリオでは、キャストは良性で不要です。

ただし、doClone()のスーパークラスで定義され、Personよりジェネリックな型を返す場合があるため、キャストを狭めることが望ましい場合があります。

タイプのインスタンス(またはPersonの継承階層内の他のクラス)doCloneを返さない場合は、がスローされます。Personjava.lang.ClassCastException

于 2012-08-22T15:48:45.723 に答える