2015-09-18 2 views
0

Мне нужно создать и вернуть общий список объектов статических вложенных классов.Создание списка статических вложенных классов в качестве общего списка

Например:

если есть класс, содержащий внешняя статические вложенные классы как InnerOne/два/три и так далее .. со своими членами и методами.

и

Я пытаюсь создать и получить свой экземпляр через класс Factory.

Как я могу это сделать?

Как я могу объявить и определить свой «общий список», как показано ниже.

, чтобы потом я мог «приказать» объектам списка к их объекту класса, используя оператор «instanceof» и вызывая их соответствующие «перегруженные» функции?

public class Outer{ 

    public static class InnerOne{ 
     //members and methods 
    }; 

    public static class InnerTwo{ 
     //members and methods 
    }; 

    public static class InnerThree{ 
     //members and methods 
    }; 
} 

public class factory{ 

    public static List<?> getInstanceList(List<String> instancetypes){ 
     List<?> genericList = new ArrayList<>(); 
     for(String instanceType : instancetypes){ 
      if(instanceType.equals("InnerOne")){ 
       genericList.add(new InnerOne()); 
      } 
      else if(instanceType.equals("InnerTwo")){ 
       genericList.add(new InnerTwo()); 
      }else{ 
       genericList.add(new InnerThree()); 
      } 
     } 
     return genericList; 
    } 
} 
+0

Это пугающе напоминает http://stackoverflow.com/questions/32614453/ use-the-command-line-to-make-new-objects/32614646 # 32614646, но вам нужен общий предок, и вы увидите их только вдоль предка, а не конкретного типа. – EpicPandaForce

+0

Это похоже на [проблема XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem), правильное решение которого - [ServiceLoader] (http://docs.oracle. ком/JavaSE/8/документы/API/Java/Util/ServiceLoader.html). – VGR

ответ

0

Во-первых, я не вижу никакой родовой здесь, потому что внутренние классы не имеют общего предка (кроме Object), и нет ничего, чтобы сделать метод родовое дальше. Во-вторых, вашему методу нужен тип return. Нечто подобное,

public static List<Object> getInstanceList(List<String> instancetypes){ 
    List<Object> genericList = new ArrayList<>(); 
    // ... 
    return genericList; 
} 

Вы можете использовать instanceof на Object; а затем приведите тип к правильному типу. Я бы предпочел, чтобы вы программировали общий интерфейс и возвращали List этого типа. Но вы можете сделать что-то вроде

for (Object obj : genericList) { 
    if (obj instanceof InnerOne) { 
     InnerOne one = (InnerOne) obj; 
    } 
} 
0

Вы могли бы сделать genericList типа List<Object>, который позволяет добавить только что-нибудь к списку. Как бы то ни было, если вы хотите получить доступ к элементам или методам, определенным во внутреннем классе, вам придется вводить их (как вы сказали).

Если внутренние классы имеют ничего общего, вы можете извлечь, что в супер класс:

public class Outer{ 

    public abstract static class InnerSuper{ 
     public abstract void method(); 
    }; 

    public static class InnerOne extends InnerSuper{ 
     //members and methods 

     @Override 
     public void method(){ 
      System.out.println("InnerOne.method()"); 
     } 
    }; 

    public static class InnerTwo extends InnerSuper{ 
     //members and methods 

     @Override 
     public void method(){ 
      System.out.println("InnerTwo.method()"); 
     } 
    }; 

    public static class InnerThree extends InnerSuper{ 
     //members and methods 

     @Override 
     public void method(){ 
      System.out.println("InnerThree.method()"); 
     } 
    }; 
} 

public class factory{ 

    public static List<InnerSuper> getInstanceList(List<String> instancetypes){ 
     List<InnerSuper> genericList = new ArrayList<>(); 
     for(String instanceType : instancetypes){ 
      if(instanceType.equals("InnerOne")){ 
       genericList.add(new InnerOne()); 
      } 
      else if(instanceType.equals("InnerTwo")){ 
       genericList.add(new InnerTwo()); 
      }else{ 
       genericList.add(new InnerThree()); 
      } 
     } 
     return genericList; 
    } 
} 

В этом случае genericList будет иметь тип List<InnerSuper>. Теперь, если вы хотите позвонить method() вы можете сделать это следующим образом:

List<String> instanceTypes = new ArrayList<>(); 
instanceTypes.add("InnerTwo"); 
instanceTypes.add("InnerOne"); 
List<InnerSuper> instances = factory.getInstanceList(instanceTypes); 
instances.get(0).method(); 

Этот код даст следующий результат:

InnerTwo.method() 
Смежные вопросы