原文链接:https://blog.csdn.net/eeeeasy/article/details/80999650?utm_source=blogxgwz2

在项目中遇到一个问题,想要封装一个通用的可接收任意类型的List对象的方法,最开始以为很容易实现,

通过List<Object>就可接收任意List<实体类>的对象,后来发现这根本行不通,最开始的思路如下

List<Student> list = new ArrayList<Student>();
List<Object> objList = list;

上面这种作为是错误的,无法转型,后来思考了一下,把List<Object>作为一个整体类型来看,他和List<实体类>确实是不存在任何关系的,并没有最开始认为的存在上下级关系,可以实现多态向上转型,所以后来想到用泛型来解决这个问题,还额外想到了另外两种方式,代码如下:

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List; /**
* @Auther: HeJD
* @Date: 2018/7/4 11:30
* @Description:
*/
public class OrderService { //方式一:
public static <T> void testList(List<T> list){ for (Object object:list) {
System.out.println(object.toString());
} }
//方式二:
public static void testList2(List list){ for (Object object:list) {
System.out.println(object.toString()); // begin---------------------> 这里是我测试一下反射的使用的,不用请忽略
//通过反射获得object对象对应的实体类的属性、及属性值
try{
//获得object对象对应的所有已申明的属性,包括public、private、和protected
Field [] fields = object.getClass().getDeclaredFields(); for (Field field:fields) { //不加这一句 private的属性无法访问的呀
field.setAccessible(true);
//获得属性名称
System.out.println("获得属性名:"+ field.getName());
//获得属性值
System.out.println("获得属性值:"+ field.get(object)); } }catch (Exception e){
e.printStackTrace();
}
//参考博主反射连接:https://blog.csdn.net/lotusyangjun/article/details/51957374
// end---------------------> 这里是我测试一下反射的使用的,不用请忽略
} }
//方式三:
public static void testList3(List<?> list) throws Exception{ for (Object object:list) {
System.out.println(object.toString()); } }
public static void main(String[] args) throws Exception { List<Student> listStudent=new ArrayList<>();
listStudent.add(new Student("王老板",50));
listStudent.add(new Student("李老板",60));
listStudent.add(new Student("河老板",70)); testList2(listStudent);
}
}

实体类也贴一下:

/**
* @Auther: HeJD
* @Date: 2018/7/11 14:18
* @Description:
*/
public class Student {
private String name;
private int age; public Student(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

结果:

用了反射的结果也记录一下:

List作为泛型参数实现可接收存储任意类型的List对象的更多相关文章

  1. Java基础 -- 泛型之泛型参数

    泛型机制常用的参数有3个: “?”代表任意类型.如果只指定了<?>,而没有extends,则默认是允许任意类. extends关键字声明了类型的上界,表示参数化的类型可能是所指定的类型,或 ...

  2. 编写高质量代码改善C#程序的157个建议[优先考虑泛型、避免在泛型中声明静态成员、为泛型参数设定约束]

    前言 泛型并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现的新功能.基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型,确保了类型安全.委托 ...

  3. Gson通过借助TypeToken获取泛型参数的类型的方法

    最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下. 由于Java泛型的实现机制,使 ...

  4. Gson通过借助TypeToken获取泛型参数的类型的方法(转)

    最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下. 由于Java泛型的实现机制,使 ...

  5. 编写高质量代码改善C#程序的157个建议——建议42:使用泛型参数兼容泛型接口的不可变性

    建议42:使用泛型参数兼容泛型接口的不可变性 让返回值类型返回比声明的类型派生程度更大的类型,就是“协变”.如: public Employee GetAEmployee(string name) { ...

  6. springMVC 接收数组参数,mybatis 接收数组参数,mybatis批量插入/批量删除案例

    案例是给一个用户赋予多个权限,多个权限用其对应的主键 id 为参数,组成了 一个id数组,传给springMVC,然后springMVC传给mybatis,然后mybatis批量插入.其实类似的场景还 ...

  7. 通过反射获取父类中的泛型参数对应的Class对象

    假设有两个类:Dao 和 PersonDao,它们的代码如下: Dao: public class Dao<T> { private Class<T> clazz; T get ...

  8. Happy Java:定义泛型参数的方法

    在平时写代码时,可以自定义泛型类.当使用同一类型的对象时,这是非常有用的,但在实例化类之前,我们不知道它将是哪种类型. 下面让我们定义一个使用泛型参数的方法.首先,在定义一个类用到泛型时,必须使用特殊 ...

  9. ParameterizedType获取java泛型参数类型

    ParameterizedType getClass().getGenericSuperclass() 返回表示此 Class 所表示的实体(类.接口.基本类型或 void)的直接超类的 Type,然 ...

随机推荐

  1. Python之日志处理(logging模块二实战)

    实战篇 import logging import logging.handlers LOG_PATH = r'./' def logConfig_1(): ''' 配置 log 输出到文件 : fi ...

  2. Socket - TCP编程

    Socket是网络编程的一个抽象概念. 通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可 socket参数及常用功能 ...

  3. 容器技术之Docker数据卷

    前一篇随笔中我们了解了docker的网络相关说明,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12952616.html:今天我们来聊一聊docker的数据管 ...

  4. SQL面试50题

    1.查询课程编号为“01”的课程比“02”的课程成绩高的所有学生的学号(重点) SELECT a.s_id,a.s_score FROM (') as a INNER JOIN (') as b on ...

  5. 剑指Offer之替换空格

    题目描述:请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 函数实现: package s ...

  6. 巧用 display: contents 增强页面语义

    display: contents 是一个比较陌生的属性,虽然属于 display 这个基本上是最常见的 CSS 属性,但是 contents 这个取值基本不会用到.但是它早在 2016 年就已经得到 ...

  7. parrot os安装drozer

    dz需要支持 大部分parrot都装好了,只有Protobuf未安装 apt install Protobuf 安装dz 下面下载https://labs.f-secure.com/tools/dro ...

  8. PAT1090 危险品装箱 (25分) ——值得留意的map用法(int型与vector型的关联)

    1090 危险品装箱 (25分)   集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里.比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸. 本题给定一张不相容物品的清单,需要你 ...

  9. thymeleaf怎么在页面上面格式化时间

    th:value="${#dates.format(后端传递的时间,‘yyyy-MM-dd HH:mm:ss’)}"

  10. Java实现 LeetCode 728 自除数(暴力)

    728. 自除数 自除数 是指可以被它包含的每一位数除尽的数. 例如,128 是一个自除数,因为 128 % 1 == 0,128 % 2 == 0,128 % 8 == 0. 还有,自除数不允许包含 ...