2017-10-24 1 views
0

다양한 양의 개체를 가져 와서 인스턴스를 만들어 목록에 추가하는 작은 함수를 만들려고합니다.여러 개체를 인스턴스화하여 목록에 넣을 수있는 일반 메서드를 만드는 방법

저는 개인적으로 String, BigDecimalLong에 이것을 사용하고 싶습니다.

가 나는 다음과 같은 기능과 밀접한 느낀다 :

<T> List<T> createGenericList(Class<T> clazz, T ...params) throws Exception { 
    List<T> list = new ArrayList<T>(); 
    for (T param : params) { 
     Constructor<T> ctor = clazz.getConstructor(clazz); 
     T instance = constructor.newInstance(param); 
     list.add(instance); 
    } 
    return list; 
} 

String 위대한 작품 :

createGenericList(String.class,"a","b") 

하지만 BigDecimal 또는 Long

createGenericList(BigDecimal.class,10,10); 

자바이기 때문에 내 번호를으로 읽는 중. 주조도 효과가없는 것 같습니다.

no instance(s) of type variable(s) exist so that Integer conforms to BigDecimal 
inference variable T has incompatible bounds: 
equality constraints: BigDecimal 
lower bounds: Integer 

나는 또한 ImmutableList.of(...)을보고 있었지만 동일한 문제가있는 것으로 보입니다.

+0

내 목표는 통과해야하는 각 추가 매개 변수에 대해'new'를 입력하지 않는 것입니다. 원래 각 개체에 대해 별도의 기능이있었습니다. 3 가지 기능을 수행하는 것이 쉬운 방법이 있다면 배우려는 시도와 거의 똑같은 일을했습니다. – CeePlusPlus

답변

3

방법에 Function<P, T> 제공 : 호출 후

<P, T> List<T> createGenericList(Function<? super P, ? extends T> func, List<? extends P> params) throws Exception { 
    List<T> list = new ArrayList<T>(); 
    for (P param : params) { 
     T instance = func.apply(param); 
     list.add(instance); 
    } 
    return list; 
} 

을 그리고 같은 :

List<ParamType> params = Arrays.asList(param1, param2); 
List<SomeType> list = createGenericList(SomeType::new, params); 

은 (SomeType를 가정하면 생성자 단일 ParamType 복용을 가지고 있지만이 컴파일 타임에 실패 그것을 경우 does not)

+0

여전히 varargs를 사용할 수 있습니까? –

+0

@ JornVernee 당신이 할 수있는 일이지만 일반적인 배열을 만들 수 있습니다. 배열과 제네릭은 불행한 녀석입니다. –

+0

편집에서 서명을 변경 한 것을 보았습니다. 두 버전은 동일하며 편집하기 전에 더 간단합니다. –

관련 문제