Фабрика универсального типа в статическом помощнике - PullRequest
0 голосов
/ 11 января 2019

Я ищу способ вернуть новый экземпляр типа, который расширяет класс abstract в Java, в идеале без отражения от статического метода.

Так что я хочу иметь возможность звонить:

SomeClass anInstanceOfSomeClass = Builder.build<SomeClass>()

Я надеялся, что смогу сделать что-то вроде:

public class Builder {

    public static <T extends SomeBaseClass> T build() {                             
        return new T(); // cannot instantiate type T            
    }

}

Я видел несколько примеров, использующих Supplier, но они, как правило, основаны либо на нестатическом, с использованием обобщенного класса, а не на методе, и / или требуют передачи ctor в качестве параметра, который кажется немного сложнее синтаксически.

Кажется, что это должно быть просто, но, исходя из C #, я не слишком знаком с лучшим способом достижения этого в Java. Любые мысли приветствуются.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Поставщик в порядке здесь:

public static <T extends SomeBaseClass> T build(Supplier<T> supplier){ 
   return supplier.get(); 
} 

Избегает отражения и обработки исключений.

И используйте его как:

SomeClass anInstanceOfSomeClass = Builder.build(SomeClass::new); 
0 голосов
/ 11 января 2019

Вы должны передать фактический класс, который хотите создать. T становится Object во время выполнения, поэтому JVM не будет знать, какой тип он должен создавать (только гипотетически)

public static <T extends SomeBaseClass> T build(Class<T>clazz) {                             
         return clazz.newInstance();
    }

И звонок будет таким простым, как вы ожидаете

SomeClass anInstanceOfSomeClass = Builder.build(SomeClass.class);

Придерживайтесь соглашения об именах Java (ClassName и methodName)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...