【发布时间】:2013-04-02 05:47:30
【问题描述】:
我了解这两种方法的用途和动机 - 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)是实例
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;
}
【问题讨论】:
-
没有根本原因无法做到这一点。我认为我们必须要问 James Gosling,为什么他在设计 Java 时不选择这样做以获得权威的答案。
-
可能是因为他在设计Java的时候没有泛型
-
有趣的是,这些都不能在这里完全起作用。最好的似乎
isAssignableFrom()