类TypeAliasRegistry
(类名中没有泛型)中有实例变量:private final Map
方法:
publicClass 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中的代码。
Class<?>和Class没有区别
Class<?>和Class<T>有区别,但是要放到具体场景中说,比如你这个例子里Class<T>中的T在运行时是指代具体类型的,虽然其实也没有什么用
方法中的<T>有必要的,因为有<T>,你才可以这样:
Class<Bar> barClass = resolveAlias("foo.Bar");
否则你就只能这样
Class<Bar> barClass = (Class<Bar>)resolveAlias("foo.Bar");
这个T是用来推断返回值类型的
我想问下类中 Class<?> 和 Class<T> 有何区别?
没区别
Class<?> 和 Class的区别?
前者可以指定一个类型
方法中的<T>有必要吗?
有必要,详情见泛型
该答案已被忽略,原因:宜作评论而非答案
ps:我不懂踩我和忽略我答案的人什么心态:我的答案和@chanjarster几乎相近,但是我比他早回答。请某些人做事不要这么主观好么?另外,再请看看@Projack答的是什么好吗?
这是个好问题,但我也不明白,等其他人回答吧。
在平时的使用中,我是这么看的,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> 就是不对的。? 号就是万能的,不用也不能预先声明 <?> 。
一样的,都是通用泛型Object