Java对象类型判断及统计拖车数量代码问题排查
Java类型判断相关问题解答
嘿,我来帮你搞定这两个Java类型相关的问题~
1. 如何判断两个对象是否为同一类型?
要判断两个对象是否属于完全相同的运行时类型,有两种可靠的方式:
- 用
getClass()结合==比较:JVM中每个类的Class对象是单例的,所以如果两个对象的getClass()返回同一个Class实例,就说明它们是同一类型。示例:
这种方式很严格,子类和父类会被判定为不同类型(比如boolean isSameType = obj1.getClass() == obj2.getClass();new Truck()和new Vehicle()的getClass()就不一样)。 - 用
getClass().equals()比较:效果和上面的==几乎一致,因为Class类重写了equals方法,本质还是比较Class实例是否相同:boolean isSameType = obj1.getClass().equals(obj2.getClass());
如果你的需求是判断对象是否属于某个类型(包括其子类),可以用instanceof关键字,但这不是“同一类型”的判断,而是“属于该类型或其子类型”的判断,比如:
// 判断obj是否是Vehicle或其子类的实例 boolean isVehicleType = obj instanceof Vehicle;
2. 统计卡车数量无输出的问题分析与解决
你说用equals判断类型时程序无输出,大概率是用错了判断类型的方式——equals是用来比较两个对象的内容是否相等,根本不是用来判断对象类型的!
错误原因推测
你可能写了类似这样的错误代码:
// 错误示例:用equals比较对象和Class实例,永远返回false int count = 0; for (Vehicle v : vehicles) { if (v.equals(Truck.class)) { // 这完全不对! count++; } } System.out.println(count);
这种写法里,Vehicle对象和Truck.class(一个Class类型的对象)调用equals,肯定返回false,所以统计结果为0,自然和预期的3不符。
修正后的正确代码
要统计列表中Truck类型的对象数量,应该用instanceof或者getClass()来判断类型:
方式1:用instanceof(允许子类,比如HeavyTruck extends Truck也会被统计)
import java.util.ArrayList; import java.util.Collection; public class TesteTest { public static void main(String[] args) { Collection<Vehicle> vehicles = new ArrayList<Vehicle>(); // 添加3个Truck实例 vehicles.add(new Truck()); vehicles.add(new Truck()); vehicles.add(new Truck()); int truckCount = 0; for (Vehicle vehicle : vehicles) { if (vehicle instanceof Truck) { // 正确判断是否是Truck类型 truckCount++; } } System.out.println(truckCount); // 输出3 } }
方式2:用getClass()(严格匹配,只有Truck本身的实例才会被统计,子类不算)
int truckCount = 0; for (Vehicle vehicle : vehicles) { if (vehicle.getClass() == Truck.class) { // 严格匹配Truck类型 truckCount++; } } System.out.println(truckCount); // 输出3
这样修改后,就能正确统计出列表中卡车的数量啦~
内容的提问来源于stack exchange,提问作者Gustavo Rey
相关产品推荐
相关产品推荐

