簡體   English   中英

Java isInstance vs instanceOf運算符

[英]Java isInstance vs instanceOf operator

整個泛型的東西有點像扔我一個循環,更多的RTT。

Specificis? 啊,這里的要點是:

enum QueryHelper {
  query1,
  query2;
  static <T> QueryHelper getQueryHelper (Class<T> expectedReturn) {
    if (expectedReturn.isInstance (SomeRelatedClass.class))
      return query1;
    else
      return query2;
  }
}

然后我會這樣稱呼它:

...
QueryHelper helper = QueryHelper.getQueryHelper(SomeRelatedClass.class);
...

這樣我就可以在實際幫助器中靈活地分配查詢返回類型。 它做了一些鑄造和對象創建。 我所看到的是,沒有比賽,我應該以其他方式這樣做嗎? 或者整個想法是不是很糟糕?

而真正的核心是我不理解class.isInstance和instanceOf運算符之間的區別? 我應該使用后者嗎?

這樣我就可以在實際幫助器中靈活地分配查詢返回類型。

這種方法的返回類型沒有任何靈活性

static <T> QueryHelper getQueryHelper (Class<T> expectedReturn) {
    if (expectedReturn.isInstance (SomeRelatedClass.class))
      return query1;
    else
      return query2;
}

它將始終返回QueryHelper的實例。 如果您希望返回類型具有靈活性,則需要將其定義為:

static <T> T getQueryHelper (Class<T> expectedReturn) {
}

現在返回類型是靈活的,因為它將取決於參數的類型

而真正的核心是我不理解class.isInstance和instanceOf運算符之間的區別?

不同之處在於instanceof執行在編譯時修復的類型檢查,例如:

static boolean isInstance(Object myVar) {
    return (myVar instanceof Foo);
}

將始終檢查myVar是否為Foo的實例,而

static <T> boolean isInstance(Object myVar, Class<T> expectedType) {
    return expectedType.isInstance(myVar);
}

將檢查myVar是expectedType的實例,但每次調用該方法時,expectedType都可以是不同的類型

Class.isInstance()不像您的代碼所期望的那樣工作。 它會測試傳遞給它的對象是否是該類的實例。 在你的代碼中:

expectedReturn.isInstance(SomeRelatedClass.class)

您傳遞的對象是Class對象。 試試這個,返回true:

Class.class.isInstance(SomeRelatedClass.class);

您可能正在尋找的是Class.isAssignableFrom() ,例如:

Object.class.isAssignableFrom(Class.class);

意味着你可以這樣做:

Class klass = ...;
Object o = klass;

isInstance的預期參數是一個對象,它可以是類對象表示的類的實例。 你要比較它的是一個類的實例... java.lang.Class 所以它不會匹配。

例如,是真的:

Class.class.isInstance(SomeRelatedClass.class);

也是如此(沒有關於以這種方式實際構建查詢助手的完整性的架構評論)

expectedReturn.isInstance(new SomeRelatedClass());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM