1. ホーム
  2. java

Hashmapがint, charで動作しない [重複].

2023-09-01 19:19:58

質問

重複の可能性があります。

Javaコレクションにプリミティブな値を格納する?

私は以下を使用するときにjavaで:-。

public HashMap<char, int> buildMap(String letters)
{
    HashMap<char, int> checkSum = new HashMap<char, int>();

    for ( int i = 0; i < letters.length(); ++i )
    {
        checkSum.put(letters.charAt(i), primes[i]);
    }

    return checkSum;
}

不適切な型に関連するエラーが発生します。charとintの代わりにCharacterとIntegerをそれぞれ使うことで問題を解決しました。しかし、なぜHashMapがプリミティブなデータ型を扱えないのかがわからず困っています。

どのように解決するのですか?

Genericパラメータは参照型にしかバインドできず、プリミティブ型にはバインドできないため、対応するラッパータイプを使用する必要があります。 試しに HashMap<Character, Integer> を試してみてください。

しかし、なぜHashMapがプリミティブなデータ型を扱えないのかがわからず、困っています。

この原因は タイプ消去 . Java には最初からジェネリックが無かったので HashMap<Character, Integer> は実際には HashMap<Object, Object> . コンパイラは、間違った型の値を入れたり、間違った型の値を出したりしないように、追加のチェックと暗黙のキャストをたくさん行いますが、実行時にはただ一つの HashMap クラスがあり、それはオブジェクトを格納します。

他の言語では、型を特化させるので、C++では vector<bool> とは全く異なり vector<my_class> とは内部的に大きく異なり、両者には共通の vector<?> のスーパータイプを共有しません。 しかし、Java は List<T> List とは関係なく T が何であるかに関係なく、ジェネリック以前のコードとの後方互換性のために、 とします。 ジェネリックタイプのすべてのパラメータ化に対して単一の実装クラスがなければならないというこの後方互換性の要件は、ジェネリックパラメータがプリミティブにバインドできるようなテンプレートの特殊化を妨げます。