2015-04-02 37 views
0

我最近遇到了Java問題。我有一個超類'Foo'的HashSet hashSet。該組填充了foo的子類:bardop。如何返回只填充bardop類值的值的新HashSet?返回一組新類別

我試過如下:

public Set<Foo> getObjectsFromClass(Foo foo) { 
    Set<Foo> objectsFromClass = new HashSet<>(); 
     for (Foo value: hashSet) { 
      if ((value instanceof Bar) && (foo instanceof Bar)) 
       objectsFromClass.add(value); 
      if ((value instanceof Dop) && (foo instanceof Dop)) 
       objectsFromClass.add(value); 
     } 
    } 
    return objectsFromClass; 
} 

但問題是,我不得不放棄參數與對象,而我只是想指定的類。我該如何解決這個問題?

回答

2

這聽起來像你想在課堂上傳遞(而不是類的實例),並使用Class.isInstance

public Set<Foo> getObjectsFromClass(Class<? extends Foo> clazz) { 
    Set<Foo> objectsFromClass = new HashSet<>(); 
    for (Foo value: hashSet) { 
     if (clazz.isInstance(value)) { 
      objectsFromClass.add(value); 
     } 
    } 
    return objectsFromClass; 
} 

然後調用它:

Set<Foo> x = getObjectsFromClass(Dop.class); 

作爲獎勵,對參數的約束意味着如果你試圖做一些愚蠢的事情,它將無法編譯:

Set<Foo> x = getObjectsFromClass(String.class); // Error 

如果您需要更改返回類型,以反映亞型爲好,可以使通用的方法:

static <T extends Foo> Set<T> getObjectsFromClass(Class<T> clazz) { 
    Set<T> objectsFromClass = new HashSet<>(); 
    for (Foo value: hashSet) { 
     if (clazz.isInstance(value)) { 
      objectsFromClass.add(clazz.cast(value)); 
     } 
    } 
    return objectsFromClass; 
} 

然後你可以使用:

Set<Dop> dops = getObjectsFromClass(Dop.class); 
+0

爲什麼我不能構建集: 'Set x = getObjectsFromClass(Dop.class);' – 2015-04-02 18:42:30

+0

@username_HI:因爲您聲明該方法將返回一個'Set '。我可以改變答案來做到這一點,如果你想...雖然(現在完成。) – 2015-04-02 18:43:50

+0

非常感謝:)! – 2015-04-02 18:48:20