web-dev-qa-db-ja.com

Java.util.Dictionaryの型パラメーターとしてのintの使用

辞書をそのように宣言しようとすると:

private Dictionary<String, int> map;

コンパイラーから次のエラーが返されます。

トークン「int」の構文エラー、このトークンの後に予期される寸法

ただし、Integerを使用すると正常に機能します。 Javaはint/Integerを別の方法で扱います(私は.NETの出身です)ですが、誰かが私に辞書でプリミティブを使用できない理由の完全な説明<>

34
Richard Szalay

Javaプリミティブはオブジェクトではないため、オブジェクトの代わりに使用することはできません。ただし、Javaはプリミティブを自動的にボックス化/ボックス化解除します(別名- autoboxing )をオブジェクトに挿入すると、次のようなことができます。

List<Integer> intList = new LinkedList<Integer>();
intList.add(1);
intList.add(new Integer(2));
...
Integer first = intList.get(0);
int second = intList.get(1);

しかし、これは実際にはコンパイラーがタイプを自動的に変換するだけのものです。

40
Jeremy Raymond

.Netでは、「プリミティブ」タイプはオブジェクトに支えられています。 Javaでは、プリミティブ型とオブジェクトの間に明確な違いがあります。 Java 5はオートボクシングを導入しました。これは特定の状況で2つを強制することができます。ただし、Javaジェネリックシステムは型消去を使用するため、十分ではありません。この場合、オートボックスする情報。

9
JohnE

Javaコレクションは、プリミティブではなく参照のみを許可します。目的を達成するには、ラッパークラス(この場合はJava.lang.Integer)を使用する必要があります。

private Dictionary<String, Integer> map;

彼らはあなたが次のようなことをすることができます:

int foo = map.get("hello");

そして

map.put("world", 42);

およびJavaは、オートボクシング/アンボクシングを使用して、変換の詳細を処理します。

ここ はそれについての小さな説明です。

5
TofuBeer
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)

それは、プリミティブで動作するようにタイプを指定するトリックです

あなたのアダプターで

同じをpackage-infoで使用すると、そのパッケージに対してグローバルにそれを行うことを意味します

実験後にこれが見つかりました。

public class MyAdapter extends XmlAdapter<String, Integer> {
1
Abs

TofuBeerの答えを拡張する。

intはプリミティブです

整数はオブジェクトです。

ジェネリックスはプリミティブをサポートしていません。

1
Keibosh

なぜなら、Javaのプリミティブは本当にプリミティブです。Java intは値で渡され、Integerは参照。NETでは、intやInt32などは単に異なる名前です。

0
Y. Shoham