Javaでの型転送の注意点
Java は厳密に型指定された言語ですが、異なる型のプリミティブ変数間で値を転送することは可能です。たとえば、値を受け取る型の記憶容量が処理できる限り、int の値を double に問題なく代入できます。
各プリミティブ型のサイズについては以下を参照してください:
より大きなストレージ容量を持つ型への値の転送には、「拡張変換」という技術名が付いています。この用語はポルトガル語では通常「拡大変換」または「拡大変換」と訳されます。これは、情報を失うことなく、より小さい、またはより制限されたデータ型の値を、より大きい、またはより包括的な型に変換するプロセスを指します。
しかし、ストレージ容量が小さい型に値を転送したい場合はどうすればよいでしょうか? Java コンパイラはこれを好みませんが、以下の例のようにキャストすると許可します。
double decimal = 65.9; int i = (int) decimal; //aqui ele perde a casa decimal e vira 65 char c = (char) i; //aqui ele vira a letra A (que corresponde a 65)
新しい型に渡される値のサイズがその型の制限を超える場合、より劇的なことが起こる可能性があります。 int i = 10 は、-128 から 127 までの範囲の 8 ビットを含むため、byte 変数に収まります。ただし、int i = 128 を byte 型の変数に入れたい場合はどうすればよいでしょうか...情報の損失。
public class Main { public static void main(String[] args) { int i = 128; byte b = (byte) i; System.out.println(b); // o valor de b agora é -128 :S } }
オートボクシング
前回の投稿 [ここで読んでください] では、Wrapper クラスについて少しお話しました。例として、私は Integer.parse(i) = i が型
であると想像してくださいと書きました。
プリミティブ int。
現在、Wrapper parse メソッドの使用は非推奨となっているため推奨されません。プリミティブを Wrapper クラスに変換し、この方法で組み込みメソッドを使用するには、次の例のように「オートボックス化」を行うことをお勧めします。
Character ch = 'a'; Integer i = 10;
これはより直接的なアプローチであることに注意してください。一度に値を代入するだけです。
その逆を行い、データをプリミティブ型として返すには、valueOf:
メソッドを使用して「ボックス化解除」を行うことができます。
Integer i = 10; int j = Integer.valueOf(i);
前の投稿で述べたように、プリミティブからラッパーを作成すると、クラスのメソッドを使用できるようになり、データの操作が容易になるという利点があります。
プリミティブのラッパー バージョンは一見するとよく似ているように見えますが、JVM はオブジェクトとプリミティブを同じように扱うわけではないことを忘れないでください。プリミティブはスタックに移動し、オブジェクトはヒープに移動することを思い出してください [ここを思い出してください]。
パフォーマンスの点では、値が参照ではなく直接保存されるため、プリミティブからデータを取得する方がコンピューターのコストが低いことは明らかです。メモリ内でデータをまとめ続けるよりも、既製のデータを取得する方がはるかに高速です。
ただし、Wrapper の使用が不可欠な場合もあります。たとえば、ArrayList クラスを操作する場合です。プリミティブ値ではなく、オブジェクトをパラメータとしてのみ受け入れます。
プリミティブからオブジェクトへ、またはその逆の変換がもたらす柔軟性は、この言語の優れた点です。しかし、ここで説明したこれらの落とし穴や他の多くの落とし穴に注意する必要があります。
社会に衝撃を与えるためです (笑) オーバーロードを扱う際のコードの予期せぬ動作に関わる問題のあるケースの例を示します (オーバーロードについてはまだ投稿していませんが、投稿します。基本的にはそうします) 、メソッドに異なるシグネチャがある場合、オーバーロードが発生します)。
この事例は、Joshua Bloch 著「Effective Java」という本で言及されています。
public class SetListTest { public static void main(String[] args) { Set<Integer> set = new TreeSet<>(); List<Integer> list = new ArrayList<>(); for (int i = -3; i < 3; i++) { set.add(i); list.add(i); } for (int i = 0; i < 3; i++) { set.remove(i); list.remove(i); // como corrigir: list.remove((Integer) i); } System.out.println(set + " " + list); }
このプログラムの目的は、-3 から 2 までの整数値 [-3, -2, -1, 0, 1, 2] をセットとリストに追加することでした。次に、正の値 [0、1、2] を削除します。しかし、このコードを実行すると、セットとリストが同じ結果を示さないことがわかります。セットは期待どおり [-3, -2, -1] を返します。リストは [-2, 0, 2] を返します。
これは、List クラスの組み込み Remove(i) メソッドの呼び出しが i をプリミティブ型 int として扱い、それ以外は何も扱わないために発生します。次に、このメソッドは位置 i の要素を削除します。
Set クラスのremove(i) メソッドの呼び出しは、Integer オブジェクトをパラメータとして受け取るオーバーロードを呼び出し、元は int であった i を Integer に自動的に変換します。このメソッドの動作では、i に等しい値を持つ (i に等しいインデックスではない) 要素がセット要素から除外されます。セットとリストの両方で予期される型は整数であることに注意してください。 (セットセット/リストリスト)。 Set クラスから削除メソッドに選択されたオーバーロードがそれを Integer に変換したのはそのためです。
List の Remove の動作はインデックスによって削除されますが、Set の Remove は値によって削除されます。すべては、Integer を受け取る Remove のオーバーロードが原因です。
以上がJavaでの型転送の注意点の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











一部のアプリケーションが適切に機能しないようにする会社のセキュリティソフトウェアのトラブルシューティングとソリューション。多くの企業は、内部ネットワークセキュリティを確保するためにセキュリティソフトウェアを展開します。 ...

多くのアプリケーションシナリオでソートを実装するために名前を数値に変換するソリューションでは、ユーザーはグループ、特に1つでソートする必要がある場合があります...

システムドッキングでのフィールドマッピング処理は、システムドッキングを実行する際に難しい問題に遭遇することがよくあります。システムのインターフェイスフィールドを効果的にマッピングする方法A ...

データベース操作にMyBatis-Plusまたはその他のORMフレームワークを使用する場合、エンティティクラスの属性名に基づいてクエリ条件を構築する必要があることがよくあります。あなたが毎回手動で...

intellijideaultimatiateバージョンを使用してスプリングを開始します...

Javaオブジェクトと配列の変換:リスクの詳細な議論と鋳造タイプ変換の正しい方法多くのJava初心者は、オブジェクトのアレイへの変換に遭遇します...

Redisキャッシュソリューションは、製品ランキングリストの要件をどのように実現しますか?開発プロセス中に、多くの場合、ランキングの要件に対処する必要があります。

eコマースプラットフォーム上のSKUおよびSPUテーブルの設計の詳細な説明この記事では、eコマースプラットフォームでのSKUとSPUのデータベース設計の問題、特にユーザー定義の販売を扱う方法について説明します。
