형식 매개 변수의 개체를 인스턴스화하는 중
템플릿 클래스는 다음과 같습니다.
class MyClass<T>
{
T field;
public void myMethod()
{
field = new T(); // gives compiler error
}
}
우리 반에서 T 인스턴스를 새로 만들려면 어떻게 해야 하나요?
유형 삭제 후 에 대해 알려진 것은T
의 아류라는 것이다.Object
. 의 인스턴스를 생성할 팩토리를 지정해야 합니다.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();
}
}
또 다른 비반사적 접근법은 하이브리드 빌더/Abstract Factory 패턴을 사용하는 것입니다.
Effective Java에서 Joshua Bloch는 Builder 패턴을 자세히 살펴보고 범용 Builder 인터페이스를 옹호합니다.
public interface Builder<T> {
public T build();
}
콘크리트 빌더는 이 인터페이스를 구현할 수 있으며 외부 클래스는 콘크리트 빌더를 사용하여 필요에 따라 Builder를 구성할 수 있습니다.빌더는 MyClass에 전달될 수 있습니다.Builder<T>
.
이 패턴을 사용하여 새로운 인스턴스를 얻을 수 있습니다.T
,라 할지라도T
에는 컨스트럭터 파라미터가 있거나 추가 설정이 필요합니다.물론 빌더를 MyClass로 넘기려면 몇 가지 방법이 필요합니다.MyClass에 아무것도 전달할 수 없는 경우 Builder와 Abstract Factory는 종료됩니다.
이것은 당신이 찾고 있는 것보다 더 무거울 수 있지만, 작동도 할 수 있습니다.이 방법을 사용하면 My Class를 호출할 때마다 메서드에 전달하는 것이 아니라 구축 시 My Class에 공장을 주입하는 것이 더 합리적입니다.
interface MyFactory<T>
{
T newObject();
}
class MyClass<T>
{
T field;
public void myMethod(MyFactory<T> factory)
{
field = factory.newObject()
}
}
서브클래스를 소거하지 않아도 되는 경우는, http://www.artima.com/weblogs/viewpost.jsp?thread=208860 를 참조해 주세요.
유형의 클래스 개체를 가져올 수 있습니다.T
어떤 변론도 거치지 않고.
이거 먹어봐.
static class MyClass<T> {
Class<?> clazz;
@SafeVarargs
public MyClass(T... dummy) {
if (dummy.length > 0)
throw new IllegalArgumentException("Do not specify arguments");
clazz = dummy.getClass().componentType();
}
@Override
public String toString() {
return "MyClass<T = " + clazz.getName() + ">";
}
}
public static void main(String[] args) {
MyClass<String> s = new MyClass<>();
System.out.println(s);
Object i = new MyClass<Integer>();
System.out.println(i);
}
출력:
MyClass<T = java.lang.String>
MyClass<T = java.lang.Integer>
유형 매개 변수의 개체를 인스턴스화할 수 있습니다.T
이것처럼.
clazz.getConstructor().newInstance();
하나의 옵션은 오브젝트와 함께 캐스팅하는 것입니다.
{field = (T) new Object();}
필드는 처음에는 Object 타입이지만 T타입으로 캐스트됩니다.캐스팅을 0으로 줄이는 것이 오브젝트 초기화의 목표이기 때문에 이것은 보기 흉한 것입니다.근데 이거면 될 것 같아.
클래스 오브t
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
'source' 카테고리의 다른 글
단일 그림에서 여러 그림에 대해 서로 다른 색상의 선을 얻는 방법 (0) | 2022.09.11 |
---|---|
regex 일치 배열을 만듭니다. (0) | 2022.09.11 |
Intelij IDEA에서 텍스트를 새 줄로 바꾸려면 어떻게 해야 합니까? (0) | 2022.09.08 |
인덱스를 알고 목록의 여러 요소에 액세스 (0) | 2022.09.08 |
단수 또는 복수 데이터베이스 테이블 이름? (0) | 2022.09.08 |