Javaは一般的なタイプのインスタンスを取得します。
Javaは一般的なタイプのインスタンスを取得します。
Java汎型は実際に多くの欠陥があります。例えば、汎型のタイプを直接取得できない、バンド汎型のクラスを取得できないなどです。
以下の方式は正しくないです。
①.汎型の種類を取得する
①.真実のタイプの存在が必要です。
②.汎型のタイプは明確である(List<User>は明確であり、List<T>は明確ではない)
以上の2点を満たすと、私たちは汎型のタイプを獲得できます。
1.継承方式により、タイプを明確にし、汎型クラスを取得する
多くの場合、クラスはパラメータとして使われていますが、私たちは実際には一般的なクラスをパラメータとして導入することができます。
私たちは普通便利のために、特定のクラスを定義しないので、次のような方法を使う必要があります。
Java汎型は実際に多くの欠陥があります。例えば、汎型のタイプを直接取得できない、バンド汎型のクラスを取得できないなどです。
以下の方式は正しくないです。
①.汎型の種類を取得する
Class lstUClazz = List<User>.class
②局所変数の汎型のタイプを取得する
List<User> listUser = new ArrayList<User>();
Type genType = listUser.getClass().getClass().getGenericSuperclass();
Class templatClazz = null;
if(ParameterizedType.class.isInstance(genType)
{
// User , ,
ParameterizedType parameterizedType = (ParameterizedType) genType;
templatClazz = (Class) parameterizedType.getActualTypeArguments()[0];
}
では、どうやって一般的なタイプを獲得できますか?①.真実のタイプの存在が必要です。
②.汎型のタイプは明確である(List<User>は明確であり、List<T>は明確ではない)
以上の2点を満たすと、私たちは汎型のタイプを獲得できます。
1.継承方式により、タイプを明確にし、汎型クラスを取得する
public abstract class JdbcDaoSupport<T> {
protected JdbcDaoSupport() {
}
public Class getTempalteType()
{
Class<T> clazz = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
return clazz;
}
}
public class UserDao extends JdbcDaoSupport<User> {
}
public class Test{
public static void main(String[] args)
{
UserDao dao = new UserDao();
Class clazz = dao.getTemplateType();
System.out.println(clazz.getName()); // xxx.xxx.User
}
}
2.クラス属性の一般タイプを取得する
public class Test extends ClassA<String> {
private List<String> list;
private Map<String, Object> map;
/***
* List
*/
public static void testList() throws NoSuchFieldException, SecurityException {
Type t = Test.class.getDeclaredField("list").getGenericType();
if (ParameterizedType.class.isAssignableFrom(t.getClass())) {
for (Type t1 : ((ParameterizedType) t).getActualTypeArguments()) {
System.out.print(t1 + ",");
}
System.out.println();
}
}
/***
* Map
*/
public static void testMap() throws NoSuchFieldException, SecurityException {
Type t = Test.class.getDeclaredField("map").getGenericType();
if (ParameterizedType.class.isAssignableFrom(t.getClass())) {
for (Type t1 : ((ParameterizedType) t).getActualTypeArguments()) {
System.out.print(t1 + ",");
}
System.out.println();
}
}
public static void main(String args[]) throws Exception {
System.out.println(">>>>>>>>>>>testList>>>>>>>>>>>");
testList();
System.out.println("<<<<<<<<<<<testList<<<<<<<<<<<
");
System.out.println(">>>>>>>>>>>testMap>>>>>>>>>>>");
testMap();
System.out.println("<<<<<<<<<<<testMap<<<<<<<<<<<
");
System.out.println(">>>>>>>>>>>testClassA>>>>>>>>>>>");
new Test().testClassA();
System.out.println("<<<<<<<<<<<testClassA<<<<<<<<<<<");
}
}
3.局所変数の汎型を取得するタイプ
List<User> lst = new ArrayList<User>(){};
Type genType = listUser.getClass().getClass().getGenericSuperclass();
Class templatClazz = null;
if(ParameterizedType.class.isInstance(genType)
{
ParameterizedType parameterizedType = (ParameterizedType) genType;
templatClazz = (Class) parameterizedType.getActualTypeArguments()[0];
}
実際には、汎型のタイプが実際には「継承」されていることがわかった。もちろんこれらのテクニックを上手に使えば、オープンソースのGsonのType Tokenは上記のテクニックを利用して、jsonと複雑なタイプの切り替えができます。多くの場合、クラスはパラメータとして使われていますが、私たちは実際には一般的なクラスをパラメータとして導入することができます。
私たちは普通便利のために、特定のクラスを定義しないので、次のような方法を使う必要があります。
Class clz = new ArrayList<User>(){}.getClass();
例
class JsonToObjectUtil {
public static <T> T jsonToObject(Class<T> clz,List<String> jsonList){
Type genType = clz.getClass().getGenericSuperclass();
Class templatClazz = null;
if(ParameterizedType.class.isInstance(genType));
{
ParameterizedType parameterizedType = (ParameterizedType) genType;
templatClazz = (Class) parameterizedType.getActualTypeArguments()[0];
}
List<Object> lst = new ArrayList<Object>();
/*****/
if(templatClazz!=null && jsonList!=null)
{
for (String str : jsonList) {
Gson gson = new Gson();
Object fromJson = gson.fromJson(str, templatClazz);
lst.add(fromJson);
}
}
/*****/
return (T) lst;
}
public static void main(String[] args) {
List<String> jsonList = null;
// jsonList
Class superClazz = new ArrayList<User>(){}.getClass();
List jsonToObject = JsonToObjectUtil.jsonToObject(superClazz, jsonList);
}
}
読んでくれてありがとうございます。みなさんのご協力をお願いします。ありがとうございます。