2015-10-05 8 views
0

Я постоянно поймаю NoSuchMethodException TypesForSets$SetType.<init>(int) во время попыток связаться с конструктором вложенного класса. У меня есть код:Отражение во вложенных классах

public class TypesForSets { 
     static <T> Set<T> fill(Set<T> set, Class<T> type) { 
      try { 
       for (int i = 0; i < 10; i++) 
        set.add(type.getConstructor(int.class).newInstance(i)); 
      } catch (Exception e) { 
       throw new RuntimeException(e); 
      } 
      return set; 
     } 

     static <T> void test(Set<T> set, Class<T> type) { 
       fill(set, type); 
     } 

     public static void main(String[] args) { 
       test(new HashSet<SetType>(), SetType.class); 
     } 

     class SetType { 
      int i; 

      public SetType(int n) { 
       i = n; 
      } 
     } 
    } 

Когда я помещал SetType отдельно как общественный класс она работает просто отлично.

ответ

3

От того, что вы делаете, похоже, что вы хотите объявить SetType как static.

Как обстоят дела, вы пытаетесь создать экземпляр SetType от static метода TypesForSets; то есть вы делаете это за пределами любого экземпляра TypesForSets. Вы не можете создать экземпляр нестатического внутреннего класса, кроме как из экземпляра охватывающего класса.

Причина, по которой он работает, если вы делаете SetType, отдельный класс в своем собственном файле состоит в том, что он не имеет охватывающего класса. Статический класс, объявленный внутри другого класса, работает так же, как класс верхнего уровня.

Можно использовать отражение для создания внутреннего (нестатического) класса, и это покрывается this question, но это не выглядит так, как будто это то, что вам нужно для вашего кода.

Смежные вопросы