辞書をそのように宣言しようとすると:
private Dictionary<String, int> map;
コンパイラーから次のエラーが返されます。
トークン「int」の構文エラー、このトークンの後に予期される寸法
ただし、Integer
を使用すると正常に機能します。 Javaはint
/Integer
を別の方法で扱います(私は.NETの出身です)ですが、誰かが私に辞書でプリミティブを使用できない理由の完全な説明<>
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);
しかし、これは実際にはコンパイラーがタイプを自動的に変換するだけのものです。
.Netでは、「プリミティブ」タイプはオブジェクトに支えられています。 Javaでは、プリミティブ型とオブジェクトの間に明確な違いがあります。 Java 5はオートボクシングを導入しました。これは特定の状況で2つを強制することができます。ただし、Javaジェネリックシステムは型消去を使用するため、十分ではありません。この場合、オートボックスする情報。
Javaコレクションは、プリミティブではなく参照のみを許可します。目的を達成するには、ラッパークラス(この場合はJava.lang.Integer)を使用する必要があります。
private Dictionary<String, Integer> map;
彼らはあなたが次のようなことをすることができます:
int foo = map.get("hello");
そして
map.put("world", 42);
およびJavaは、オートボクシング/アンボクシングを使用して、変換の詳細を処理します。
ここ はそれについての小さな説明です。
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)
それは、プリミティブで動作するようにタイプを指定するトリックです
あなたのアダプターで
同じをpackage-infoで使用すると、そのパッケージに対してグローバルにそれを行うことを意味します
実験後にこれが見つかりました。
public class MyAdapter extends XmlAdapter<String, Integer> {
TofuBeerの答えを拡張する。
intはプリミティブです
整数はオブジェクトです。
ジェネリックスはプリミティブをサポートしていません。
なぜなら、Javaのプリミティブは本当にプリミティブです。Java int
は値で渡され、Integer
は参照。NETでは、intやInt32などは単に異なる名前です。