Quelle est la différence entre la catégorie de "Classe" et la classe "Type" en java?
J'ai lu cette question SO qui parle de la différence entre les classes et les types en java
Cependant, cela parle des classes déclarées avec le mot-clé class
plutôt que de la classe réelle Class
en java. En Java, je peux avoir un Class<T>
où T est un type de classe/interface/tableau (et pour les primitives, T
serait la classe autoboxed, mais l'instance de Class<T>
serait associée au type primitif, tel que int.classe). Point est, Class
est utilisé avec plus que des types de classe.
Quelle est la différence entre la classeClass
et l'interface Type
? Quand utiliserais-je jamais Type
dans un programme java?
1 answers
Type
est une superinterface de Class
. Vous n'aurez généralement pas besoin de l'utiliser sauf si vous faites de la réflexion avec des types génériques.
, Comme un exemple, nous pouvons obtenir le type d'un champ à l'aide de Field.getType()
:
Class<?> c =
String.class.getField("CASE_INSENSITIVE_ORDER")
.getType();
Le problème est que String.CASE_INSENSITIVE_ORDER
est en fait un Comparator<String>
, et le code ci-dessus ne nous Comparator.class
. Cela ne fonctionne pas pour nous si nous avions besoin de savoir quel était l'argument de type.
Type
et ses utilisations ont été ajoutées dans Java 1.5 (avec les génériques) pour ce type de situation. Nous pourrions plutôt utiliser la méthode Field.getGenericType()
:
Type t =
String.class.getField("CASE_INSENSITIVE_ORDER")
.getGenericType();
Dans ce cas, il renverrait une instance de ParameterizedType
, avec Comparator.class
comme type brut et {[13] } dans ses arguments de type:
ParameterizedType pt = (ParameterizedType) t;
pt.getRawType(); // interface java.util.Comparator
pt.getActualTypeArguments(); // [class java.lang.String]
Cette partie de l'API n'est pas très bien développée, mais il y en a de meilleures construites autour, comme Guava TypeToken
.