类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中的代码。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
一样的,都是通用泛型Object
这是个好问题,但我也不明白,等其他人回答吧。
在平时的使用中,我是这么看的,
public <T> Class<T> resolveAlias这里,第一个 <T> 是一个声明,表示在此处引入这个 T,看你最开始的地方(类上或方法参数上)怎么写,比如 X 也行。第二个 Class<T> 才是限制返回的,返回类对象且必须是 T 类型的类。而 ? 是不需要先声明的,比如public Class<? extends T>。我想您的例子不够全,没有涉及方法参数泛型方面,您在类上已经定义了 <T> 了,我试着在 IDE 里编写类似代码,并去掉方法第一个 <T>,确实不会报任何错,而且可以编译通过。但如果方法:
此处的 <X,Y,Z> 省略将无法编译, 除非在类上有声明。
我再实践研究了下,返回类型里或变量的声明类型,Set<? extends String> 与 Set<T> 对应,此类没声明泛型,你也不能用<>钻石符,这个好理解,查文档就知道 Class 的定义是
Class Class<T>,相反的例子 Object<? extends String> 就是不对的。? 号就是万能的,不用也不能预先声明 <?> 。我想问下类中 Class<?> 和 Class<T> 有何区别?
没区别
Class<?> 和 Class的区别?
前者可以指定一个类型
方法中的<T>有必要吗?
有必要,详情见泛型
该答案已被忽略,原因:宜作评论而非答案
ps:我不懂踩我和忽略我答案的人什么心态:我的答案和@chanjarster几乎相近,但是我比他早回答。请某些人做事不要这么主观好么?另外,再请看看@Projack答的是什么好吗?
Class<?>和Class没有区别
Class<?>和Class<T>有区别,但是要放到具体场景中说,比如你这个例子里Class<T>中的T在运行时是指代具体类型的,虽然其实也没有什么用
方法中的<T>有必要的,因为有<T>,你才可以这样:
否则你就只能这样
这个T是用来推断返回值类型的