2015-04-02 2 views
0

Недавно я столкнулся с проблемой Java. У меня есть HashSet hashSet с суперклассом «Foo». Этот набор заполняется подклассами foo: bar и dop. Как вернуть новый HashSet, заполненный значениями, только значениями bar или dop?вернуть новый набор для одного класса

Я попытался следующие:

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);' –

+0

@username_HI: Поскольку вы объявили, что метод вернет 'Set '. Я могу изменить ответ, чтобы сделать это, если вы хотите, хотя ... (Совершено сейчас.) –

+0

Большое спасибо :)! –