저는 .NET 녀석입니다. 그래서 처음에는 몇 가지 Java 개념에 대한 이해를 표명하겠습니다. 내가 잘못하면 저를 수정하십시오.. Java 형식의 클래스 <>에 해당하는 .Net?
의 .NETwhere
제한과 유사
class GenericClass< ? extends IInterface> { ... }
... :
class GenericClass<T> where T: IInterface { ... }
자바의 Class
클래스 유형을 설명하고
자바 제네릭 경계 와일드 카드의 개념을 지원 약은 Type
클래스
지금까지 그렇게 좋았습니다. 그러나 Java generic typed Class<T>
에 가까운 동등 함을 찾을 수 없습니다. 여기서 T는 바운드 와일드 카드입니다. 이는 기본적으로 Class
이 나타내는 유형에 제한을 부과합니다.
Java로 예를 들어 보겠습니다.
String custSortclassName = GetClassName(); //only known at runtime,
// e.g. it can come from a config file
Assembly assy = GetAssembly(); //unimportant
Type customClass = assy.GetType(custSortclassName);
if(!customClass.IsSubclassOf(typeof(IExternalSort))){
throw new InvalidOperationException(...);
}
IExternalSort impl = (IExternalSort)Activator.CreateInstance(customClass);
Java 버전이 나에게 청소기 같습니다
String custSortclassName = GetClassName(); //only known at runtime,
// e.g. it can come from a config file
Class<? extends IExternalSort> customClass
= Class.forName("MyExternalSort")
.asSubclass(IExternalSort.class); //this checks for correctness
IExternalSort impl = customClass.newInstance(); //look ma', no casting!
내가 .NET에서 얻을 수있는 가장 가까운이 같은 것입니다. . NET을 개선하는 방법이 있습니까?
String custSortclassName = GetClassName();
Assembly assy = GetAssembly();
Type customClass = assy.GetType(custSortclassName);
IExternalSort impl = Activator.CreateInstance(customClass) as IExternalSort;
if(impl==null) throw new InvalidOperationException(...);
을하지만, 여기에 당신을 위해 문제가 될 수 있습니다 그것의 유형을 확인하기 전에 인스턴스를 만드는거야 :
이것은 약간 쉽지만 간단히 where 제한에'new()'제약 조건을 추가하는 것이 불가능할까요? 'MyExternalSort : IExternalSort T : IExternalSort, new()'와 같은 것을 사용하고'var impl = new T();'를 사용합니까? 개인적으로 나는 그러한 시나리오에서 동일한 인터페이스를 구현하는 유형의 인스턴스를 생성하기 위해 팩토리 패턴을 사용할 것이다. –
Carsten
Java generics에 대해서는 잘 모릅니다. 그러나 JVM 지원이 다르게 구현되어 있고 .NET generics가 지원하지 않는 여러 가지 기능을 지원한다는 것을 알고 있습니다. 모든 것에 대해 똑같은 "동등한"것을 기대하지 마십시오. – jalf
@Aschratt이 글은 제 질문과 관련이없는 것 같습니다. 이 트릭은 모든 유형 정보가 컴파일 타임에 알려지면 유용 할 수 있지만 MyExternalSort 유형은 런타임 전까지 알 수 없습니다. 정렬 라이브러리의 클라이언트가 구현할 수 있으며 이름으로 만 지정됩니다. –