我试图回答这个简短的回答问题,但我很难理解我的导师所说的“我们为什么想知道这个?”的意思。任何意见是极大的赞赏。
问题:
“instanceof 运算符有什么用处?显然它会指定它是否是某物的“实例”——这不是答案。问题是,我们为什么想知道这一点?
我试图回答这个简短的回答问题,但我很难理解我的导师所说的“我们为什么想知道这个?”的意思。任何意见是极大的赞赏。
问题:
“instanceof 运算符有什么用处?显然它会指定它是否是某物的“实例”——这不是答案。问题是,我们为什么想知道这一点?
运算符最明显和最常见(误用)的用法instanceof
是决定对子类进行特殊处理:
void recordPayment(Payment pmt) {
// Do something common for all subclasses
recordAmount(pmt.getAmount());
// Do something special for the credit card subclasses
if (pmt instanceof CreditCardPayment) {
CreditCardPayment ccPmt = (CreditCardPayment)pmt;
recordCreditCardNumber(ccPmt.getCardNumber());
}
}
使用instanceof
通常几乎可以肯定地表明您的设计缺少基类中的函数和派生类中的覆盖。
如果想要向下转换一种类型,他可能需要 instanceof 运算符。但这通常表明代码有异味。
你可以参考这篇文章:“Prefer polymorphism over instanceof and downcasting”。
更新:
似乎 OP 没有贬低的意思,让我们更详细地解释一下。
向下转换将对象/值的表观类型细化/缩小为其子类型之一,使其具有子类型的语义。
当一个对象/值被声明为它的超类型时,这很有用,但是调用者需要一些特定于子类型中的语义或接口(即超类型中不存在的那些)。只有在对象/值通过instanceof
's 测试并向下转换为该子类型之后,调用者才能使用其特定的语义或接口。
一个非常常见的需要使用它的地方是使用 JSON。您可以接收一个 JSON 值,它是类地图项和类数组项的“嵌套”,例如,类数组项的特定元素的类型可能是类地图项或类数组项,具体取决于在许多因素上。
Soinstanceof
用于解决这个问题,或者至少确保存在预期的类型,而不是尝试强制转换和炸毁。
取决于你需要什么。我几乎所有时间都使用“实例”,例如当我处理具有“对象”类型的变量等时。
一个简单的事情是在数组中使用具有不同类型的对象。例如:
Object[] data = new Object[4];
data[0] = "String";
data[1] = 32;
data[2] = 32.64D;
data[3] = new ArrayList<String>();
然后,您可以检查内容:
if (data[0] instanceof String) {
// Content at index '0' is a String
}
在这种情况下,您有一个superclass
, 引用,它可以引用它的任何派生类实例。
例如,有一个abstract
类Clothes
。三个类Shirt
,Shorts
并且Jeans
是从它派生的。
Clothes coolshirt=new Shirt();
Clothes coolshorts=new Shorts();
Clothes cooljeans=new Jeans();
Clothes gift=receiveGift();
if(gift instanceof Shirt)//Is the gift refers to a instance of Shirt
sendGratitude("Thanks for your new Shirt. It is really cool");
else if(gift instanceof Shorts)//Is the gift refers to a instance of Shorts
sendGratitude("Your shorts fits nice for me.Thank you.");
else if(gift instanceof Jeans)//Is the gift refers to a instance of Jeans
sendGratitude("In your Jeans I really look, Handsome, Very Thanks");