2010-05-09 7 views
3

Duplicate: Instantiating generics type in java자바 제네릭 - 유형

안녕을 받고! 저는 C#을 사용하는 사람에게 자바를 제공하려고합니다. 그래서 자바에서 다음과 같이 할 수 있습니다. C#에서

public T create_an_instance_of<T>(){ 
    T instance = default (T); 
// here's usually some factory to create the implementation 
    instance = some_factory.build<T>(); 
// or even.. 
    instance = some_factory.build(typeOf(T)); 

return instance; 
} 

답변

5

자바의 제네릭은 type erasure을 기반으로합니다. 이를 통해 하위 호환성을 얻을 수 있지만 런타임에 존재하지 않으므로 type 매개 변수 자체를 사용할 수 없음을 의미합니다. 제네릭이 아닌 구체화 때문에

public <T> T create_an_instance_of(Class<T> c){ 
    return c.newInstance(); // or use constructors via reflection 
} 
+0

레코드의 경우 예외로 인해 컴파일되지 않습니다.) – Bozho

+0

레코드의 경우 하향 보이스는 내 것이 아닙니다. 모든 대답이 downvoted 것처럼 보입니다. – Bozho

0

당신은 자바로 할 수 없어 : 당신이 할 수있는

가장 가까운 것은 이것이다. "형식 토큰"이라고하는 것을 사용할 수는 있지만 한계가 있습니다.

static <T> T construct(Class<T> klazz) { 
    try { 
     return klazz.newInstance(); 
    } catch (InstantiationException e) { 
     return null; 
    } catch (IllegalAccessException e) { 
     return null; 
    } 
} 

System.out.println(construct(String.class).isEmpty()); // prints "true" 

이 (공용 인수 없음의 생성자가 없다 예를 들어, 경우) 항상 성공하지 않는 반사를 사용하여 객체를 구성 Class<?>.newInstance()를 사용합니다.

0

시도 뭔가 같은 :

public static <T> T createInstance(Class<T> clazz) 
     throws IllegalArgumentException, SecurityException, 
     InstantiationException, IllegalAccessException, 
     InvocationTargetException, NoSuchMethodException { 
    T ans = clazz.getConstructor().newInstance(); 
    return ans; 
} 
0

올바른 선택은 추상 공장을 사용하는 것입니다. 그냥 넘겨 주면 public no-arg 생성자가 없거나 인터페이스 클래스의 적절한 구현 클래스가없는 클래스의 인스턴스를 만들 수도 있습니다.

반사가 절대적으로 불필요하며 잘못된 선택입니다.

+1

시스템의 모든 유형에 대해이를 사용하려면 추상 팩터 리가 불필요한 오버 헤드가됩니다. – Bozho