매개 변수 유형의 객체 인스턴스화
다음과 같은 템플릿 클래스가 있습니다.
class MyClass<T>
{
T field;
public void myMethod()
{
field = new T(); // gives compiler error
}
}
내 클래스에서 T의 새 인스턴스를 만들려면 어떻게해야합니까?
타입 삭제 한 후에 대해 알려진 모든이 T
가 어떤 서브 클래스이다 Object
. 의 인스턴스를 만들려면 일부 팩토리를 지정해야합니다 T
.
한 가지 접근 방식은 다음을 사용할 수 있습니다 Supplier<T>
.
class MyClass<T> {
private final Supplier<? extends T> ctor;
private T field;
MyClass(Supplier<? extends T> ctor) {
this.ctor = Objects.requireNonNull(ctor);
}
public void myMethod() {
field = ctor.get();
}
}
사용법은 다음과 같습니다.
MyClass<StringBuilder> it = new MyClass<>(StringBuilder::new);
또는 Class<T>
개체를 제공 한 다음 반사를 사용할 수 있습니다.
class MyClass<T> {
private final Constructor<? extends T> ctor;
private T field;
MyClass(Class<? extends T> impl) throws NoSuchMethodException {
this.ctor = impl.getConstructor();
}
public void myMethod() throws Exception {
field = ctor.newInstance();
}
}
또 다른 비 반사 접근 방식은 하이브리드 빌더 / 추상 팩토리 패턴을 사용하는 것입니다.
Effective Java에서 Joshua Bloch는 Builder 패턴을 자세히 살펴보고 일반적인 Builder 인터페이스를 옹호합니다.
public interface Builder<T> {
public T build();
}
콘크리트 빌더는이 인터페이스를 구현할 수 있으며 외부 클래스는 콘크리트 빌더를 사용하여 필요에 따라 빌더를 구성 할 수 있습니다. 빌더는 MyClass에 Builder<T>
.
이 패턴을 사용하면 생성자 매개 변수가 있거나 추가 구성이 필요한 T
경우에도 의 새 인스턴스를 가져올 수 T
있습니다. 물론 Builder를 MyClass에 전달할 방법이 필요합니다. MyClass에 아무것도 전달할 수 없으면 Builder와 Abstract Factory가 종료됩니다.
이것은 당신이 찾고있는 것보다 더 무거울 수 있지만 작동합니다. 이 방법을 사용하면 호출 될 때마다 메서드에 전달하는 대신 생성 될 때 MyClass에 팩토리를 주입하는 것이 더 합리적입니다.
interface MyFactory<T>
{
T newObject();
}
class MyClass<T>
{
T field;
public void myMethod(MyFactory<T> factory)
{
field = factory.newObject()
}
}
If you're willing to subclass you can avoid erasure as well, check out http://www.artima.com/weblogs/viewpost.jsp?thread=208860
Class classOfT
try {
t = classOfT.newInstance();//new T(); NOTE: type parameter T cannot be instantiated directly
} catch (Exception e) {
e.printStackTrace();
}
참고URL : https://stackoverflow.com/questions/299998/instantiating-object-of-type-parameter
'Development Tip' 카테고리의 다른 글
Angular 2에서 EventEmitter.next ()와 EventEmitter.emit ()의 차이점 (0) | 2020.10.12 |
---|---|
Microsoft 내부 PriorityQueue의 버그 (0) | 2020.10.12 |
Should I use … in HTML5? (0) | 2020.10.12 |
Django 모델 필드 기본값은 동일한 모델의 다른 필드를 기반으로 함 (0) | 2020.10.12 |
Java JVM 프로파일 링, 스레드 상태- "모니터"상태는 무엇을 의미합니까? (0) | 2020.10.12 |