ホームページ Java &#&チュートリアル Javaでの型転送の注意点

Javaでの型転送の注意点

Sep 12, 2024 am 10:16 AM

Java は厳密に型指定された言語ですが、異なる型のプリミティブ変数間で値を転送することは可能です。たとえば、値を受け取る型の記憶容量が処理できる限り、int の値を double に問題なく代入できます。

各プリミティブ型のサイズについては以下を参照してください:

Cuidados com transferência de tipos em Java

より大きなストレージ容量を持つ型への値の転送には、「拡張変換」という技術名が付いています。この用語はポルトガル語では通常「拡大変換」または「拡大変換」と訳されます。これは、情報を失うことなく、より小さい、またはより制限されたデータ型の値を、より大きい、またはより包括的な型に変換するプロセスを指します。

しかし、ストレージ容量が小さい型に値を転送したい場合はどうすればよいでしょうか? 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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? 会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? Apr 19, 2025 pm 04:51 PM

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

名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? 名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? Apr 19, 2025 pm 11:30 PM

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

MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? Apr 19, 2025 pm 06:21 PM

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

エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? Apr 19, 2025 pm 11:42 PM

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

Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Apr 19, 2025 pm 11:45 PM

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

Javaオブジェクトを配列に安全に変換する方法は? Javaオブジェクトを配列に安全に変換する方法は? Apr 19, 2025 pm 11:33 PM

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

Redisキャッシュソリューションを使用して、製品ランキングリストの要件を効率的に実現する方法は? Redisキャッシュソリューションを使用して、製品ランキングリストの要件を効率的に実現する方法は? Apr 19, 2025 pm 11:36 PM

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

eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? Apr 19, 2025 pm 11:27 PM

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

See all articles