2017-04-04 7 views
2

編集:オブジェクトをクローンする必要があるときにこの問題が発生し、検索しましたが問題は解決しません。Java:クローンの前に型キャストする?

Javaのプロトタイプパターンを学習していたときに、チュートリアルに従って、タイプキャストについて(Bike)super.clone()を混乱させました。

最初に行われるのはどちらですか? (Bike)superまたはsuper.clone()?なぜ(Bike)が必要なのですか?

public interface Prototype extends Cloneable 
{ 
    public Prototype clone() throws CloneNotSupportedException; 
} 

public class Bike implements Prototype 
{ 
    // Constructor and other methods... 

    // My question is here 
    public Prototype clone() throws CloneNotSupportedException { 
     return (Bike)super.clone(); 
    } 
} 
+1

[Java casting order](http://stackoverflow.com/questions/5762270/java-us/)の重複している可能性があります。キャストオーダー) – Tom

答えて

2

キャストは関数呼び出しよりも低い優先順位があります:あなたのケースでは

(Foo) a.f1().f2().f3() // Casts to Foo at the end of the calls chain 

をあなたがするのでObject

+0

私は '(Foo)'と 'a'の間にスペースを見つけたので投票します。これはポイントを思い出すのに役立ちます。 – user7813604

2

クラスsuper.clone()は、結果は、(Bike)(キャストは次式の結果に適用されている)を使用して鋳造され、最初の実行します。

Object#clone()をオーバーライドしているため、キャストが必要です。これは、ジェネリックより前のJDK1.0に戻し、戻りタイプはObjectです。

1

を返しObject.clone()から継承されたメソッドであるsuper.clone()を呼んでいるので、キャストが必要ですPrototypeはスーパークラスの自転車で、super.clone()が呼び出されるとクローンオブジェクトが返され、明示的にBiotypeのPrototypeのより具体的なサブクラスに型キャストされます。

タイプキャストは、Bikeクラスの要件に合わせて必要です。 作成されたすべてのオブジェクトはスーパークラスとしてオブジェクトクラスを持ちますが、スーパークラス(オブジェクトクラス)に定義されていないユーザー定義メソッドもあります。子クラスにキャストを入力すると、同じオブジェクトから親メソッドと子メソッドにアクセスできます

関連する問題