JAVA泛型“<T>”的使用

业务背景:

    在SSM框架下,controller要将从逻辑层接收到的数据封装到一个json对象中并返还给客户端,而返回的响应数据的类型不能确定,可能是String、Map、List 等等。

使用了泛型的自定义类:

   ResponseResult<T>是自定义的一个bean实体类:

    public class ResponseResult<T> {
	
	    public static final int STATE_OK= 1 ;
	    public static final int STATE_ERROR= -1 ;
	
	    //状态码
	    private int state;
	    //状态信息描述
	    private String message;
	    //响应数据
	    private T data;
	
        public void setData(T data) {
	        this.data = data;
        }
	    //以下为构造、tostring、get、set、hashcode、equals等方法,此处省略
    };

Controller:

    @RequestMapping("/GetArea.do") 
	@ResponseBody
	public ResponseResult<String> GetArea(){
		String str = protectedService.getAllPoint();
		System.out.println("Controller -- GetArea -- str :" + str);
		
		ResponseResult<String> rr = new ResponseResult<String>();
		rr.setState(ResponseResult.STATE_OK);
		rr.setData(str);
		return rr;
	}

创建对象时<>中的String就是泛型的类型,可以任意指定。需要注意的是泛型需要在创建对象时进行指定,而在当前对象中,指定泛型类型之后,<T>就固定指代对应的类型;

例如:

ResponseResult<String> rr = new ResponseResult<String>();

带有泛型的方法使用时不需要指定泛型,编译器会自己找出具体的类型。泛型方法除了定义不同,调用就像普通方法一样。

上述代码中,由于在创建对象时,<>中指定了泛型为String:

    ResponseResult<String> rr = new ResponseResult<String>();
    

所以此时 T 已经被指定为了String类型。ResponseResult类对应的实体类 rr 中的data属性和setData()方法已经隐式的发生了变化。

    private String data;
	
    public void setData(String data) {
	    this.data = data;
    }

调用setData()方法时,只能传入String类型的参数,若传入其他参数则编译器会报错

    rr.setData(str);

 

引用自百度百科:

1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。

    //简单类型指byte/short/int等,如需使用可以选择对应的封装类。

2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。

3、泛型的类型参数可以有多个。

           //多个参数之间直接用“,”隔开即可。如:<T,V>

4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上称为“有界类型”。

5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName("java.lang.String")。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值