Class.isInstance()方法提供了一种动态的测试对象的途径。于是所有那些单调的instanceof语句都可以从PetCount.java的例子中移除了。如下所示:
//: typeinfo/PetCount3.java
// Using isinstance()
import typeinfo.pets.*;
import java.util.;
import net.mindview.util.Print.;
public class PetCount3 {
static class PetCounter extends linkedHashMap
public PetCounter () {
super(MapData.map(LiteralPetCreator.allTypes,0));
}
public void count(Pet pet) {
//Class.isInstance() eliminates instanceofs:
for(Map.Entry
if(pair.getKey().isInstance(pet)) put (pair.getKey(),pair.getValue()+1);
]
public String toString() {
StringBuilder result = new StringBuilder("{");
for(Map.Entry
result.append(pair.getKey().getSimpleName());
result.append("=");
result.append(pair.getValue());
result.append(",");
}
result.delete(result.length()-2,result.length());
result.append("}");
return result.toString();
}
}
public static void main(String[] args) {
PetCounter petCount = new PetCounter();
for(Pet pet : Pets.createArray(20)) {
printnb(pet.getClass().getSimpleName()+" ");
petCount.count(pet);
}
print();
print(petCount);
]
]//:~
为了对所有不同类型的Pet进行计数,PetCounter Map预加载了LiteralPetCreator.allTypes中的类型。这使用了net.mindview.util.MapData类,这个类接受一个Iteralbe(allTypes List)和一个常数值(在本例中是0),然后用allTypes中元素作为键,用0作为值,来填充Map。如果不预加载这个Map,那么你最终将只能对随机生成的类型进行技术,而不包括诸如Pet和Cat这样的基类型。
可以看到,isInstance()方法使我们不再需要instanceof表达式。此外,这意味着如果要求添加新类型的Pet,只需简单地改变LiteralPetCreator.java数组即可;而毋需改动程序其他部分(但是在使用instanceof时这是不可能的)。
toString()方法已经被重载,使得输出更容易被读取,而该输出与打印Map时所看到的典型输出仍然是匹配的。



