我了解这两者的用法和动机 - isInstance 是运行时等效于 instanceOf。但是,为什么我们有两种方法?为什么我们不能有一个适用于这两种情况的 instanceof 关键字的通用实现?
例如,这是当前使用这些的方式:
1)实例
public Collection<String> extract(Collection<?> coll) {
Collection<String> result = new ArrayList<String>();
for (Object obj : coll) {
if (obj instanceof String) {
result.add((String) obj);
}
}
return result;
}
2)isInstance
public <T> Collection<T> extract(Collection<?> coll, Class<T> type) {
Collection<T> result = new ArrayList<T>();
for (Object obj : coll) {
if (type.isInstance(obj)) {
result.add((T) obj);
}
}
return result;
}
所以,我的问题是为什么我们不能有一个满足上面第二个例子的 instanceof 运算符的通用实现,如下所示?(即为什么它不能在运行时解析类型?)
public <T> Collection<T> extract(Collection<?> coll, Class<T> type) {
Collection<T> result = new ArrayList<T>();
for (Object obj : coll) {
if (obj instanceof type) {
result.add((T) obj);
}
}
return result;
}