java - Class<?> 和 Class<T> 之间的区别
PHP中文网
PHP中文网 2017-04-18 09:44:18
[Java讨论组]

TypeAliasRegistry(类名中没有泛型)中有实例变量:
private final Map<String, Class<?>> TYPE_ALIASES = new HashMap<String, Class<?>>();

方法:

public <T> Class<T> resolveAlias(String string) {
    try {
      if (string == null) {
        return null;
      }
      // issue #748
      String key = string.toLowerCase(Locale.ENGLISH);
      Class<T> value;
      if (TYPE_ALIASES.containsKey(key)) {
        value = (Class<T>) TYPE_ALIASES.get(key);
      } else {
        value = (Class<T>) Resources.classForName(string);
      }
      return value;
    } catch (ClassNotFoundException e) {
      throw new TypeException("Could not resolve type alias '" + string + "'.  Cause: " + e, e);
    }
  }

此类没有子类, 我想问下类中 Class<?> 和 Class<T> 有何区别? Class<?> 和 Class的区别? 方法中的<T>有必要吗?

----------------下面是自己写的一个例子, 但是没有报错(运行时)。方法中的<T>不是没必要了吗!---------------------

public class Base {
    private static Map<String, Class<?>> map = new HashMap<>();

    static {
        map.put("string", String.class);
        map.put("integer", Integer.class);
    }

    @SuppressWarnings("unchecked")
    public <T> Class<T> get(String str) {
        return (Class<T>) map.get(str);
    }

    @Test
    public void t() throws IllegalAccessException, InstantiationException {
        Base base = new Base();
        Class<Integer> string = base.get("string");
        System.out.println(string);
    }
}

补充下, TypeAliasRegistry这个类不是我自己写的, 是mybatis3中的代码。

PHP中文网
PHP中文网

认证0级讲师

全部回复(4)
黄舟

一样的,都是通用泛型Object

PHP中文网

这是个好问题,但我也不明白,等其他人回答吧。

在平时的使用中,我是这么看的,public <T> Class<T> resolveAlias 这里,第一个 <T> 是一个声明,表示在此处引入这个 T,看你最开始的地方(类上或方法参数上)怎么写,比如 X 也行。第二个 Class<T> 才是限制返回的,返回类对象且必须是 T 类型的类。而 ? 是不需要先声明的,比如 public Class<? extends T>

我想您的例子不够全,没有涉及方法参数泛型方面,您在类上已经定义了 <T> 了,我试着在 IDE 里编写类似代码,并去掉方法第一个 <T>,确实不会报任何错,而且可以编译通过。但如果方法:

public <X,Y,Z> X abc(X a, Y y, Z z) {
    return null;
}

此处的 <X,Y,Z> 省略将无法编译, 除非在类上有声明。


我再实践研究了下,返回类型里或变量的声明类型,Set<? extends String> 与 Set<T> 对应,此类没声明泛型,你也不能用<>钻石符,这个好理解,查文档就知道 Class 的定义是 Class Class<T>,相反的例子 Object<? extends String> 就是不对的。? 号就是万能的,不用也不能预先声明 <?> 。

巴扎黑
  • 我想问下类中 Class<?> 和 Class<T> 有何区别?

  • 没区别

  • Class<?> 和 Class的区别?

  • 前者可以指定一个类型

  • 方法中的<T>有必要吗?

  • 有必要,详情见泛型

该答案已被忽略,原因:宜作评论而非答案
ps:我不懂踩我和忽略我答案的人什么心态:我的答案和@chanjarster几乎相近,但是我比他早回答。请某些人做事不要这么主观好么?另外,再请看看@Projack答的是什么好吗?

迷茫
  1. Class<?>和Class没有区别

  2. Class<?>和Class<T>有区别,但是要放到具体场景中说,比如你这个例子里Class<T>中的T在运行时是指代具体类型的,虽然其实也没有什么用

  3. 方法中的<T>有必要的,因为有<T>,你才可以这样:

    Class<Bar> barClass = resolveAlias("foo.Bar");

    否则你就只能这样

    Class<Bar> barClass = (Class<Bar>)resolveAlias("foo.Bar");

这个T是用来推断返回值类型的

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号