这是我最近在一次采访中提出的一个问题,候选人希望将其添加到Java语言中。人们通常认为Java没有通用化泛滥的痛苦,但是当Java 泛化后,候选人实际上并不能告诉我他在那里可以实现的目标。
显然,由于Java中允许使用原始类型(以及不安全的检查),因此有可能破坏泛型并以List<Integer>
实际包含String
s的a结尾。如果类型信息得到证实,这显然变得不可能。但是肯定不止于此!
人们可以发布他们真正想做的事的示例吗?我的意思是,显然您可以List
在运行时获取a的类型-但是您将如何处理?
public <T> void foo(List<T> l) {
if (l.getGenericType() == Integer.class) {
//yeah baby! err, what now?
编辑:对此的快速更新,因为答案似乎主要是担心需要将a Class
作为参数传递(例如EnumSet.noneOf(TimeUnit.class)
)。我一直在寻找一些不可能做到的东西。例如:
List<?> l1 = api.gimmeAList();
List<?> l2 = api.gimmeAnotherList();
if (l1.getGenericType().isAssignableFrom(l2.getGenericType())) {
l1.addAll(l2); //why on earth would I be doing this anyway?
findClass()
必须忽略参数化,但defineClass()
不能这样做)。正如我们所知,具有向后兼容性的权力至关重要。