2013-05-27 22 views
9

誰かが拡大変換または縮小変換を使用する理由を説明していただけますか?私はこれらについてたくさん読んだことがありますが、誰も私に実用的な例を与えてくれません。ありがとう!拡大/縮小変換の実際のアプリケーションですか?

+0

数百万の例がありますが、コードを書くときは毎日実行しているはずです。 –

+0

私は学生で、数年前からプログラミングを勉強していましたが、これまでにこれまでに遭遇したことはありません。もし私がそれに遭遇したなら、この質問をすることには意味がないだろうが、批評に感謝する。 –

答えて

16

(Java)拡大および縮小変換は、関連するタイプ間の変換に関係します。例えば、抽象的な(スーパー)クラスとその(子)サブクラスの間の関係を取る。 java.lang.Numberクラス(抽象クラ​​ス)と直接サブクラスIntegerを使用しましょう。ここでは、持っている:

(superclass)        Number 
            __________/\__________ 
           /  |  |  \ 
(concrete subclasses)   Integer Long Float Double 

拡大変換は:我々は、特定のタイプ(サブクラス)を取り、以下の特定のタイプ(スーパークラス)にそれを割り当てようとすると発生します。

Integer i = new Integer(8); 
Number n = i; // this is widening conversion; no need to cast 

絞り込み変換:私たちは以下の特定のタイプ(スーパークラス)に乗り、明示的なキャストが必要で、より具体的なタイプ(サブクラス)、に代入しようとしたときに発生します。

Number n = new Integer(5); // again, widening conversion 
Integer i = (Integer) n; // narrowing; here we explicitly cast down to the type we want - in this case an Integer 

あなたがそのようにClassCastExceptionsように注意する必要がある特定の問題があります。これを処理する

Integer i = new Integer(5); 
Double d = new Double(13.3); 
Number n; 

n = i; // widening conversion - OK 
n = d; // also widening conversion - OK 

i = (Integer) d; // cannot cast from Double to Integer - ERROR 

// remember, current n = d (a Double type value) 
i = (Integer) n; // narrowing conversion; appears OK, but will throw ClassCastException at runtime - ERROR 

一つの方法は、instanceofキーワードでifステートメントを使用することです:

if(n instanceof Integer) { 
     i = (Integer) n; 
} 

なぜこれを使用しますか?たとえば、あるプログラムの人事の階層を作っていて、「Person」という名のファーストクラスと、「Student」、「Teacher」、「Secretary」などのサブクラスがあるとします。最初に一般的な人物を作成し、それをconstructorに設定されたstudenIDのための追加の可変フィールドを持つStudentに(継承を介して)割り当てることができます。あなたにもそのタイプのより一般的な(広い)をパラメータとして入力し、取り扱うすべてのサブクラスをとり、単一の方法で使用することができます。

public static void main(String[] args) { 
    Person p = new Student("John", "Smith", 12345); 
    printInfo(p); 
} 

// this method takes the wider Person type as a parameter, though we can send it a narrower type such as Student if we want 
public static void printInfo(Person p) { 
    System.out.println("First: " + p.getFirstName()); 
    System.out.println("Last: " + p.getLastName()); 
    if (p instanceof Student) { 
     System.out.println((Student)p).getStudentID()); // we cast p to Student with Narrow Conversion which allows us to call the getStudentID() method; only after ensuring the p is an instance of Student 
    } 
} 

私は、これは物事を処理するための理想的な方法ではないかもしれない実現しますが、ために私はそれがいくつかの可能性を示すのに役立つと思ったデモンストレーションのために。専門 - - >それはあなたが、より一般的になっているとき、拡幅として知られ、一般化

2

一部のコードで、真偽値を含むintが返された場合は、正しく表現されているboolに短縮することができます。
逆の操作もできます。

アスキー値との比較を行うには、charintに広げることができます。

Dogのインスタンスを取得し、それをIAnimalに広げて関数に渡すことができます。

List<IAnimal>の動物の種類が何らかの理由で工場や他の場所にあることがわかっている場合は、IAnimalDogに短縮することができます。

+1

javaでは、intをブール値に変換できません。これは、非常に多くのバグを引き起こしているCの特質です。 – Voo

2

暗黙の変換を使用して、異なるタイプの数値で数式を実行します。 now()が長いよう秒でタイムスタンプを返す場合たとえば、:

long t = now() 
long nextMinute = t + 60 

あなたはtに追加することができますので、あなたは長い間に60の暗黙の拡大変換(int)を行っています。このような変換を行うことができれば、数学の作成がはるかに容易になります。

1

コンバージョンの拡大と縮小の標準的な例の1つは、特定のファイルI/Oライブラリがどのように機能するかです。多くの場合、ファイル処理ライブラリには、ファイルから単一の文字を読み取る関数/メソッドがあります。読み込む文字がある場合、関数はその文字を返す必要があり、文字が残っていなければ、これを通知するために、センチネル値EOFを返す必要があります。

任意の文字がファイルに表示される可能性があるため、通常の関数/メソッドは、この署名を持っているでしょう:

ここ
int readCharacter(); 

を、関数は、文字が読み、保持しているされた場合char値を保持intを返します。それ以外はセンチネルとしてEOFEOFは、通常、charで保持するには大きすぎる整数として選択されます。そうすれば、あなたはこれを行うことができます:

while (true) { 
    int ch = readCharacter(); 
    if (ch == EOF) break; 

    char actualCharValue = (char) ch; 
    /* process actualCharValue here */ 
} 

これは役に立ちます。

1

変換...これを取ります。

例えば、外科医 - >メディコ。この場合、キャスティングは必要ありません。なぜなら、外科医はデフォルトでメディコだからです。したがって、外科医がメディコができるすべてのものを実行できることは当然です。

一方、 変換 - 一般化 - >専門化すると、より専門的になっているときには、絞り込みとして知られています。

Medico - >外科医など。この場合、キャスティングを追加する必要があります。メディコは、外科医、医師、または看護師になることができるからです。あなたの看護師に手術を依頼すれば、それを考えてください。

恐ろしい、右???

あなたは考えがあるといいですね。

関連する問題