java.util.dictionary의 유형 매개 변수로 int를 사용합니다
-
18-09-2019 - |
문제
사전을 선언하려고 할 때 :
private Dictionary<String, int> map;
컴파일러는 다음과 같은 오류를 제공합니다.
토큰 "int"의 구문 오류,이 토큰 이후에 예상되는 치수
그러나 그것은 잘 작동합니다 Integer
. 나는 Java가 대우한다는 것을 모호하게 알고 있습니다 int
/ Integer
다르게 (나는 .NET 배경에서 나왔지만) 누군가가 사전에서 프리미티브를 사용할 수없는 이유에 대한 자세한 설명을 할 수 있기를 바랐다.
해결책
Java Primitives는 객체가 아니므로 물체 대신 사용할 수 없습니다. 그러나 Java는 자동으로 박스/Unbox Primitives (일명 오토 옥싱) 객체로 : 다음과 같은 작업을 수행 할 수 있습니다.
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는 특정 상황에서 두 가지를 강요 할 수있는 오토 옥싱을 도입했습니다. 그러나 Java Generics 시스템은 유형 발전을 사용하기 때문에이 경우 Autobox에 대한 정보가 충분하지 않습니다.
Java Collections는 원시적이 아닌 참조 만 허용합니다. 래퍼 클래스 (이 경우 java.lang.integer)를 사용하여 다음을 수행해야합니다.
private Dictionary<String, Integer> map;
그들은 당신이 다음과 같은 일을 할 수 있습니다.
int foo = map.get("hello");
그리고
map.put("world", 42);
그리고 Java는 자서전/Unboxing을 사용하여 전환의 세부 사항을 처리합니다.
여기 그것에 대한 약간의 설명입니다.
Tofubeer의 답변을 확장합니다.
int는 원시입니다
정수는 대상입니다.
제네릭은 프리미티브를 지원하지 않습니다.
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)
그것이 프리미티브와 함께 작동하도록 유형을 지정하는 트릭입니다.
어댑터에서
패키지 -info에서 동일하게 사용하면 해당 패키지에 대해 전 세계적으로 수행 할 수 있습니다.
실험 후 이것을 발견했습니다.
public class MyAdapter extends XmlAdapter<String, Integer> {
Java에서는 프리미티브가 진정으로 원시적이기 때문입니다. 자바에서 int
가치에 따라 통과합니다 Integer
참조를 통과합니다. .NET int 또는 int32 등의 이름은 다른 이름입니다.