/*
* T表示泛型,子类继承了父类,父类有参数为泛型,比如
* 父类public class FatherAction<T>
* 子类public class SonAction extends FatherAction<TheUser>
* 所以这里需要一个实体类 public class TheUser{private String username; private String password; //set和get方法略}
*
* 父类方法内:
* 1、使用Class modelClass=this.getClass()获得子类;this.getClass()=class test.SonAction
* 2、使用modelClass.getGenericSuperclass(); 得到泛型父类+具体化的参数,其实就是他父类自己获取了自己,不同之处在于是通过子类获得自己,所以带有了子类的属性,即泛型参数已经被具体化了;
* Type genType = modelClass.getGenericSuperclass():genType=test.FatherAction<test.TheUser>
* 3、父类获取具体参数的数组序列 Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
* 对于代码级别需要做个判断:// 如果没有实现ParameterizedType接口,即不支持泛型,直接返回Object.class
* if (!(genType instanceof ParameterizedType)){return Object.class;}
* 然后是越界判断
* if (index >= params.length || index < 0){throw new RuntimeException("你输入的索引" + (index < 0 ? "不能小于0" : "超出了参数的总数"));}
* 最后是获取父类中获取这个具体的参数
* if (!(params[index] instanceof Class)){return Object.class;}
* Class<T> modelC= (Class) params[index];
*
* 已经获取到子类的具体参数了,现在在分类中把这个参数赋值给泛型
* T model=modelC.newInstance();
*
* 而在子类中,可以直接使用model.getUserName();
*
*
* instanceof是Java、php的一个二元操作符(运算符),
* 和==,>,<是同一类东西。由于它是由字母组成的,
* 所以也是Java的保留关键字。
* 它的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。
* 可以用来判断继承中的子类的实例是否为父类的实现。
* 相当于c#中的is操作符。java中的instanceof运算符是用来在运行时指出对象是否是特定类的一个实例。
* instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
*
* 结论:左边 是 右边 的实现即为true
* 当子类继承父类,如果父类中有this.class,在没有覆盖父类方法的情况下,获得的是子类
*/Instanceof和泛型
Java泛型与反射实践
最新推荐文章于 2023-12-30 11:21:56 发布
本文详细介绍了如何在Java中利用反射机制获取泛型参数,并将这些参数应用于实际的类实例化过程。通过一个具体的例子展示了父类如何通过子类获取泛型的实际类型。
1656

被折叠的 条评论
为什么被折叠?



