java - Class<?> 和 Class<T> 之间的区别

 主播新鲜看连 发布于 2022-10-28 18:35

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

方法:

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

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

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

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

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

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

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

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

4 个回答
    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是用来推断返回值类型的

    2022-10-30 02:57 回答
    • 我想问下类中 Class<?> 和 Class<T> 有何区别?

    • 没区别

    • Class<?> 和 Class的区别?

    • 前者可以指定一个类型

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

    • 有必要,详情见泛型

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

    2022-10-30 03:02 回答
  • 这是个好问题,但我也不明白,等其他人回答吧。

    在平时的使用中,我是这么看的,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> 就是不对的。? 号就是万能的,不用也不能预先声明 <?> 。

    2022-10-30 03:03 回答
  • 一样的,都是通用泛型Object

    2022-10-30 03:06 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有