使用泛型实现返回不同类型的对象

本次功能的实现场景:读取Yaml配置文件,然后将其中的信息转换成指定的对象。

在这里定义了一个Yaml的工具类,希望工具类的返回对象类型可以根据调用方法时传入的对象类型来定义。

通过泛型实现

工具类:

public class YamlUtil {
    public <T> T readNodeFromYml(Class<T> type) throws YamlException, FileNotFoundException{

        File dumpFile = new File(System.getProperty("user.dir") + "/src/main/conf/searchNode.yml");

        YamlReader reader = new YamlReader(new FileReader(dumpFile));

        return reader.read(type);

    }
}

调用工具类

public static void main(String[] args) throws Exception {

        YamlUtil util=new YamlUtil();

        //读取yaml文件
        SearchNode searchNode = util.readNodeFromYml(SearchNode.class);
        TestStrategy strategy = searchNode.getTestStrategy();
        int num=strategy.add(2, 3);
        System.out.println(num);
    }

通过<T> 声明告诉JVM返回值定义一个泛型 T

这里的T只是个占位符的效果,26个字母随便写哪个字母都可以,但一定要是和< >里面相同的字母,这里使用T。

工具类传入的参数也是T类型的,通过Class<T> type定义一个T类型的参数,最终此方法的作用就成了:传入一个指定类型的对象,然后读取Yaml配置文件后再返回一个此类型的对象。

使用泛型和使用Object有何不同

在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。

泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。

由此可见,使用泛型,有2个好处:

  1. 不需要做强制类型转换
  2. 编译时更安全。

原文地址:https://www.cnblogs.com/jpfss/p/9928638.html

时间: 2024-10-19 14:55:58

使用泛型实现返回不同类型的对象的相关文章

oc对象函数什么时候返回值类型使用instancetype

oc中定义对象函数时经常会返回本类类型的对象,此时返回值类型用instancetype或者本类对象*都可以,什么区别呢? 其实主要区别在返回值是不是self并且有继承 如果返回值是self并且作为父类,那么返回值最好写成instancetype 举例说明: 父类的声明 @interface Father : NSObject @property(readwrite,nonatomic,assign)NSInteger item; //元素自增 为了比较自增返回类型定为instancetype -

C++制作一个泛型容器(可以盛放各种类型的对象)

如果你想要一个可以盛放各种类型的对象,那么基本上可以说在C++里没有,或者你可以用vector<boost::any>或者其他的什么来模拟,我说那都不怎么好.问题就在于我的类型会在运行时动态的增加,你不可能知道我会增加什么类型,我的头文件也不会给你. 现在是不是觉得C++的泛型用不上了,是的,C++的泛型本质上是对相似代码的复用,做的事情都是同一件事情,但仅仅是处理类型的差别.这种情况用的还是比较少的,比如vector,queue,map等这些容器是用泛型的最好的地方了.但你想过没有,这些类型

C#把对象类型转化为指定类型,转化失败时返回该类型默认值

/// <summary> ///通用类型扩展方法类 /// </summary> public static class ObjectExtensions { /// <summary> ///把对象类型转化为指定类型,转化失败时返回该类型默认值 /// </summary> /// <typeparam name="T"> 动态类型 </typeparam> /// <param name="v

LINQ返回DataTable类型 list转dataset 转换为JSON对象

using System.Web.Script.Serialization; using System.Collections.Generic; using System.Reflection; using System.Data; using System; namespace CommonCode { public class Common { /// <summary> /// LINQ返回DataTable类型 /// </summary> public static Da

C#如何根据DataTable生成泛型List或者动态类型list

背景:在项目中,sql语句检索返回DataTable,然后根据检索结果做进一步的操作,本篇文章即是介绍如何将DataTable快速生成泛型List返回. 假设存在如下学生类: 1 public class student 2 { 3 public int ID { get; set; } 4 public string StuName { get; set; } 5 public string CityCode { get; set; } 6 } 存在如下数据表Student: 1.泛型List

使用反射为泛型集合添加其他类型的数据时遇到的问题

泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合进会去掉“类型”信息,使程序运行效率不受影响. 由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合虽加入其它类型的数据. 所以我们可以用反射为泛型集合添加其他类型的数据. 例1: ArrayList<Integer> arrayList = new ArrayList<Integer>(); arrayList .add(10); a

父类通过泛型获得子类Class类型 以及Type体系

1.背景介绍 在实现SSH框架中,DAO层向数据库持久化的过程中,因为大部分保存对象的方法都会调用到sava():所有索性就把save delete update select 方法进行封装到父类中,这时候就遇到了个问题,子类在调用这些方法的时候,需要根据子类的类型获知子类Class类型:这个时候可以通过传入泛型,根据泛型的类型来获取子类的Class类型:  2.实现代码范例 父类:public abstract class Parents<E> { private Class<?>

Python 类型和对象(转)

译文:http://wiki.woodpecker.org.cn/moin/PyTypesAndObjects 原文:http://www.cafepy.com/article/python_attributes_and_methods/ 解释新式的Python对象(new-style): <type 'type'> and <type 'object'>是什么东西 用户定义的类及实例是如何相互关联的,和内置类型有啥关系how user defined classes and in

赋值运算符函数的返回值类型详解

在c++赋值运算符函数的学习中,对于返回值类型的问题,一直非常费解,今天彻底总结一些每种不同返回值类型的结果: 1.当返回值为空时: <span style="font-size:14px;">void hasptr::operator=(const hasptr& s)</span> 这个时候如果只有一个'='(a = b)运算那就没问题,但是如果存在'='(a = b = c)的链式操作时,编译器就会报错 我们看:a = b = c: 程序会先运行