<T>和<?>区别
作者:六月的雨在infoQ
- 2022 年 8 月 16 日 北京
本文字数:1041 字
阅读完需:约 3 分钟
<T>和<?>的区别
<T>用于泛型类型的声明
<?>用于方法的接受参数或者是返回类型
大部分情况下如果要进行方法的参数接收会考虑使用<?>,它的特点是可以保证程序不出现不必要的修改。
举例 Demo.java
package com.project.web.controller.common;
//现在这个 T 表示需要设置一个泛型来定义 msg 属性类型
class Message<T> {
private T msg;
public void setMsg(T msg) {
this.msg = msg;
}
public T getMsg(){
return msg;
}
}
public class Demo {
public static void main (String []args) {
Message<String> msg = new Message<String>();
/*因为泛型可以设置所有的类型,所以面对于当前的开发环境就发现 fun() 方法将出现问题,
也就是说如果 Message 使用的时候设置的不是 String,那么就有可能无法使用。*/
msg.setMsg("Hello");
//可以接收所有的 Message 定义的泛型类型
fun(msg);
}
//使用"类 <?>" 表示只能取得内容,但不允许设置内容
public static void fun(Message<?> temp) {
//无法设置
//temp.setMsg("AASAA");
System.out.println(temp.getMsg());
}
}
复制代码
<T>的用法举例
运行结果
代码 demo2.java 及注释如下:
package com.project.web.controller.common;
//创建接口
interface IMessage {
void send(String msg);
}
//创建接口实现类
class TextMessage implements IMessage {
@Override
public void send(String msg) {
System.out.println("[send msg]:"+msg);
}
}
//创建工厂类
class Factory {
public static IMessage getInstance(String className) {
return new TextMessage();
}
}
//利用泛型创建的工厂类
class Factory2 {
public static <T> T getInstance (Class<T> clas) throws Exception {
return clas.newInstance();
}
}
public class Demo2 {
public static void main(String[] args) throws Exception {
//Factory 工厂只能为一个接口IMessage服务,日常应是会有很多个接口对象通过工厂获得
IMessage hello = Factory.getInstance("hello");
hello.send("hello world");
//泛型工厂类创建对象,可以根据传入不同的类名.class获取对应的对象
TextMessage instance = Factory2.getInstance(TextMessage.class);
instance.send("hello world 2");
}
}
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 3
版权声明: 本文为 InfoQ 作者【六月的雨在infoQ】的原创文章。
原文链接:【http://xie.infoq.cn/article/3813b9200af9d490d62f31b49】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
六月的雨在infoQ
关注
让技术不再枯燥,让每一位技术人爱上技术 2022.07.22 加入
还未添加个人简介
评论