3

だから、これは私がJavaで気づいたことです:

クラスを作成する場合:

class IntStorage
{
    public int i;

    public void setInt(int i) { this.i = i; }
    public int getInt() { return i; }
}

それを継承し、他のデータを保存します。

class IntAndStringStorage : IntStorage
{
    public String s;

    public void setString(String s) { this.s = s; }
    public String getString() { return s; }
}

そして、私はこれを行います:

IntAndStringStorage IandSstorage = new IntAndStringStorage();
IandSstorage.setString("Test");
IntStorage Istorage = (IntStorage)IandSstorage;
IntAndStorageStorage test = (IntAndStorageStorage)Istorage;
System.out.println(test.getString());

継承されたクラスにキャストしても完全に有効です。ここで、情報がまだオブジェクト内にあると想定しているため、古い情報を保持せずに、継承されたクラスに完全にキャストできますか? ストレージ クラスStringにストレージを残したくありません。int

4

2 に答える 2

13

キャストは Java のオブジェクトを変更しません(C# とは異なり、Java のキャストはオーバーロードできません)。したがって、キャストは、オブジェクトが表示される [コンパイル時の] 型のみを変更します。オブジェクトを元の型にキャストすることは常に完全に有効です。

オブジェクトを「切り詰める」には、

  1. より少ない情報で新しいオブジェクト (おそらく基本型)を作成するには、または;
  2. さまざまな「カットアウト」フィールドにスローアウトする(つまり、null/デフォルト値を割り当てる)可変オブジェクトがあります。

また、インターフェイスは一般に、基本型に依存するよりも、特定の「ビュー」を公開するための優れた方法です。

于 2013-05-04T05:03:20.247 に答える