34

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

private Dictionary<String, int> map;

コンパイラは私に次のエラーを与えます:

トークン「int」の構文エラー、このトークンの後にディメンションが必要です

しかし、それはうまく動作しIntegerます。intJava が/を異なる方法で扱うことは漠然と認識していますがInteger(私は .NET のバックグラウンドを持っています)、Dictionary<> でプリミティブを使用できない理由について、誰かが完全な説明をしてくれることを望んでいました。

4

6 に答える 6

40

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);

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

于 2010-01-04T19:56:02.807 に答える
9

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

于 2010-01-04T19:57:27.657 に答える
5

Java コレクションでは、プリミティブではなく参照のみが許可されます。ラッパー クラス (この場合は java.lang.Integer) を使用して、次のことを行う必要があります。

private Dictionary<String, Integer> map;

次のようなことができます。

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

map.put("world", 42);

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

これについて少し説明します

于 2010-01-04T19:53:24.843 に答える
1
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)

これが、プリミティブで機能するようにタイプを指定するトリックです。

アダプター内

package-infoで同じものを使用すると、そのパッケージに対してグローバルに実行することになります

実験した後にこれを見つけました。

public class MyAdapter extends XmlAdapter<String, Integer> {
于 2011-05-31T00:00:59.810 に答える
1

TofuBeerの答えを拡張します。

int はプリミティブです

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

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

于 2010-01-04T20:02:03.110 に答える
0

Java では、プリミティブは真にプリミティブであるためです。Java ではint値渡し、whileIntegerは参照を渡します。.NET int または Int32 などでは、名前が異なるだけです。

于 2010-01-04T19:56:16.753 に答える