2013-05-22 73 views
27

對於這個例子:檢查,如果對象是一個類的實例(而不是它的子類的實例)

public class Foo{} 

public class Bar extends Foo{} 

.... 

void myMethod(Foo qux){ 
    if (checkInstance(qux,Foo.class)){ 
    .... 
    } 
} 

我如何檢查是否qux是美孚的一個實例(但不是一個實例它的子類foo)?那就是:

  • checkInstance(qux,讓Foo.class)=真
  • checkInstance(qux,Bar.class)= FALSE

是否有某種說法像instanceof此檢查?或者我應該使用qux.getClass().equals(Foo.class)

+0

霍普(父&子類將根本不會被考慮的)這有助於http://www.java-samples.com/showtutorial.php?tutorialid=332你可以用'qux的instanceof Foo' – DaGLiMiOuX

+0

@Selvin使用instanceof並不一定意味着應用程序設計是錯誤的。例如,當您嘗試將數據映射到多個視圖類型時,它在適配器中使用。 –

+1

但檢查對象是Foo的實例,但不是Bar(當Bar擴展Foo時)是錯誤的應用程序設計 – Selvin

回答

39

如果你必須這樣做,唯一的辦法就是你建議的getClass().equals(Foo.class)選項。

但是,OO設計的目標是讓您以同樣的方式對待任何Foo。在普通程序中,實例是否是子類應該是不相關的。

+3

+1第二部分 – Selvin

+11

我認爲很多堆棧交換問題是關於超出正常情況的。 –

+0

@WarrenDew我同意。但是,很大一部分人都在尋求一種方法來實現他們自己的問題解決方案,當時可能存在更好的解決方案。當你發現自己用面嚮對象語言打破面向對象的原則時,這是一個非常好的跡象表明你不在滑雪道。 –

2

應的instanceof

if(qux instanceof Foo && !(qux instanceof Bar)) { 
    ... 
} 

這適用於類和接口使用,因此,在大多數情況下,它應該優先於.class不與接口工作。

+2

這不會捕捉到'Baz'是'Foo'的子類的情況。 –

+0

是這樣嗎? '&&'的rhs應該爲'Bar'的實例返回false,而不管它擴展了哪些類 –

+1

假設'Baz'是'Foo'的直接子類。然後,'if'子句的兩邊將評估爲'true'。 –

6

如果您正在尋找準確的課程匹配,唯一的方法是qux.getClass().equals(Foo.class)。 instanceof也會爲子類返回true。

0

那麼你已經知道qux是instanceof Foo(除非它是空的......),所以簡單的qux instanceof Bar和空檢查應該是你所需要的。

1
package com.instance; 

    public class Foo { 
     public void instance(Foo f) { 
      System.out.println("---------"); 
      System.out.println(f.getClass()); 
      System.out.println(getClass()); 
      if (f.getClass() == getClass()) { 
       System.out.println("Yes"); 
      } else { 
       System.out.println("No"); 
      } 
     } 
    } 


package com.instance; 

public class Main { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     Foo f1 = new Foo(); 
     Foo f2 = new Foo(); 
     Foo f3 = new Bar(); 
     f1.instance(f1); 
     f1.instance(f2); 
     f1.instance(f3); 
    } 

} 
+4

一張圖片可能會畫出千言萬語,但大量的代碼肯定會造成一個難看的答案。 –

2

我只是想下面的代碼,它似乎像

public class BaseClass { 

    private String a; 

    public boolean isInstanceOf(BaseClass base){ 
     if(base == null){ 
      return false; 
     } 
     else if(getClass() == base.getClass()){ 
      return true; 
     }else{ 
      return false; 
     } 
    } 

} 



public class DervidClass extends BaseClass { 


    public boolean isInstanceOf(DervidClass base) { 
     if(base == null){ 
      return false; 
     } 
     else if(getClass() == base.getClass()){ 
      return true; 
     }else{ 
      return false; 
     } 
    } 


} 

public class myTest { 
public static void main(String[] args) throws ParseException { 


     BaseClass base = new BaseClass(); 
     BaseClass base1 = new BaseClass(); 
     DervidClass derived = new DervidClass(); 

     BaseClass d1 = new DervidClass(); 

     System.out.println(base.isInstanceOf(d1)); 
     System.out.println(d1.isInstanceOf(d1)); 
     System.out.println((d1 instanceof BaseClass)); 


    } 
1

我看了這迄今已公佈,但找不到滿意的答案卻把所​​有的答案工作的罰款。回答這種檢查有沒有類似instanceof的說法?或者我應該使用qux.getClass().equals(Foo.class)問題我會說是的,在java中有instanceof運算符來檢查對象是否是類的實例。下面是一個示例 - :

class Vehicle { 

} 

class Car extends Vehicle { 

} 

public class Research { 
    public static void main(String[] args) { 
     Vehicle vehicle = new Vehicle(); 

     if (vehicle instanceof Vehicle) { 
      System.out.println("vehicle instanceof Vehicle : TRUE"); 
     } else { 
      System.out.println("vehicle instanceof Vehicle : FALSE"); 
     } 

     if (vehicle instanceof Car) { 
      System.out.println("vehicle instanceof Car : TRUE"); 
     } else { 
      System.out.println("vehicle instanceof Car : FALSE"); 
     } 

     System.out.println(); 
     Car car = new Car(); 

     if (car instanceof Vehicle) { 
      System.out.println("car instanceof Vehicle : TRUE"); 
     } else { 
      System.out.println("car instanceof Vehicle : FALSE"); 
     } 

     if (car instanceof Car) { 
      System.out.println("car instanceof Car : TRUE"); 
     } else { 
      System.out.println("car instanceof Car : FALSE"); 
     } 
    } 
} 

- 輸出信號:

vehicle instanceof Vehicle : TRUE 
vehicle instanceof Car : FALSE 

car instanceof Vehicle : TRUE 
car instanceof Car : TRUE 

描述 - :instanceof運營商,告訴我們一個對象是一個類的實例或它的父類(到任何水平)。
vehicle instanceof Car : FALSE輸出行指示instanceof運算符不會告訴對象是否是其子類的實例。

另一種方法是使用getClass().equals(Foo.class)來確定對象是否是類的實例。讓我們來看看下面的示例 - :

class Vehicle { 

} 

class Car extends Vehicle { 

} 

public class Research { 
    public static void main(String[] args) { 
     Vehicle vehicle = new Vehicle(); 

     if (vehicle.getClass().equals(Vehicle.class)) { 
      System.out.println("vehicle instanceof Vehicle : TRUE"); 
     } else { 
      System.out.println("vehicle instanceof Vehicle : FALSE"); 
     } 

     if (vehicle.getClass().equals(Car.class)) { 
      System.out.println("vehicle instanceof Car : TRUE"); 
     } else { 
      System.out.println("vehicle instanceof Car : FALSE"); 
     } 

     System.out.println(); 
     Car car = new Car(); 

     if (car.getClass().equals(Vehicle.class)) { 
      System.out.println("car instanceof Vehicle : TRUE"); 
     } else { 
      System.out.println("car instanceof Vehicle : FALSE"); 
     } 

     if (car.getClass().equals(Car.class)) { 
      System.out.println("car instanceof Car : TRUE"); 
     } else { 
      System.out.println("car instanceof Car : FALSE"); 
     } 


    } 
} 

- 輸出信號:

vehicle instanceof Vehicle : TRUE 
vehicle instanceof Car : FALSE 

car instanceof Vehicle : FALSE 
car instanceof Car : TRUE 

描述 - :這將是從上面的例子,其中之一(從兩個以上)明確應選擇在哪裏?

重要註釋 - :

  1. instanceof操作者不會在殼體拋出NullPointerException異常,如果參考變量不指向任何物體(即其具有空引用)。
  2. car.getClass().equals(Car.class)將拋出NullPointerException例外,如果car不指向任何對象(即其具有空引用)。因此,必須對此加上額外的空檢查,例如car != null && car.getClass().equals(Car.class)以防止它從NullPointerException
  3. instanceof運算符告訴對象是一個類的實例還是它的父類(最高級別)。
  4. car.getClass().equals(Car.class)會告訴對象是否只是一個類的實例。
相關問題