写点什么

<T>和<?>区别

  • 2022 年 9 月 26 日
    北京
  • 本文字数:1066 字

    阅读完需:约 3 分钟

<T>和<?>区别

<T>和<?>的区别

<T>用于泛型类型的声明;

<?>用于方法的接受参数或者是返回类型;

大部分情况下如果要进行方法的参数接收会考虑使用<?>,它的特点是可以保证程序不出现不必要的修改。

举个例子看一下,这里写一段伪代码

//现在这个 T 表示需要设置一个泛型来定义 msg 属性类型class Message<T> {
private T msg;
public void setMsg(T msg) { this.msg = msg; }
public T getMsg(){ return msg; }
}
复制代码

再补充一个类执行 main 函数

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()); }}
复制代码

此处使用"类 <?>" 表示只能取得内容,但不允许设置内容

运行 main 函数得到结果如图


<T>的用法举例

我们举例看一下,demo2 代码如下

//创建接口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(); }}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"); }}
复制代码

执行 demo2 的 main 函数执行结果如图


发布于: 刚刚阅读数: 3
用户头像

让技术不再枯燥,让每一位技术人爱上技术 2022.07.22 加入

还未添加个人简介

评论

发布
暂无评论
<T>和<?>区别_泛型_六月的雨在InfoQ_InfoQ写作社区