나는 C#을 일부 자바 코드를 포팅하고있는 형식화되지 않은 컬렉션을 가질 수와 나는이 가로 질러 :나는 C#을
List<?>
내가이 유형 Unknown
의 List
이해한다. 결과적으로 다른 곳에서 유형을 지정할 수 있습니다 (런타임에는 확실하지 않습니다).
C#의 기본 기능은 무엇입니까?
나는 C#을 일부 자바 코드를 포팅하고있는 형식화되지 않은 컬렉션을 가질 수와 나는이 가로 질러 :나는 C#을
List<?>
내가이 유형 Unknown
의 List
이해한다. 결과적으로 다른 곳에서 유형을 지정할 수 있습니다 (런타임에는 확실하지 않습니다).
C#의 기본 기능은 무엇입니까?
List<Foo>
내가 당신보다 List<?>
을 취하는 방법이있는 경우 자바의 List<?>
에 가장 일치하는 C# 4.0 IEnumerable<out T>
있을 거라고 생각, 작동하지 않습니다
List<Object> objList = new List<Object>();
List<String> strList = new List<String>();
doSomething(objList); //OK
doSomething(strList); //OK
public void doSomething(List<?> theList) {
///Iterate through list
}
C# 4.0 IEnumerable<T>
인터페이스는 실제로입니다 :과 같이 List<String>
List<Object>
로 호출 할 수 있습니다입니다. 즉, R
이 T
에서 파생 된 경우 IEnumerable<R>
에 IEnumerable<T>
을 할당 할 수 있습니다.
List<Object> objList = new List<Object>();
List<String> strList = new List<String>();
DoSomething(objList); //OK
DoSomething(strList); //OK
public void DoSomething<T>(IEnumerable<T> theList) {
///Iterate through list
}
편집 : C# 4.0을 사용할 수없는 경우, 당신은 항상 두 유형이 지정되지 않은 IEnumerable
로 다시 떨어질 수
그래서, 당신이 할 일은 당신의 doSomething
DoSomething
로하고 IEnumerable<T>
매개 변수를 받아 가지고있다 또는 IList
.
C# 4.0은 declaration-site variance를 사용하는 반면 Java는 use-site입니다. 사용 사이트는 "읽기 - 쓰기"인터페이스가 공통적 인 곳에서 더 의미가 있습니다. –
당신은 단지
List<object>
이것은 작동하지 않습니다. '목록
를 사용할 수 있습니다 나는 질문자가 C#을 등가로이
int size2(List<?> list)
{
return 2*list.size();
}
List<Foo> list = ...
size2(list);
같은 것을 변환하고 싶은 생각합니다. 그것은 단지 List<Object>
을 받아 들일 때문에
다음 코드는하지
int size2(List<Object> list)
{
return 2*list.size();
}
(전용 인터페이스와 명 규모)를 지원하지 않습니다 contravariance의 구현, 자바의'목록 >'에 해당되지 않습니다 일 것입니다 : INT의 SIZE2을
IList
은 (는) 찾고있는 소리입니다. 이는 목록에 대한 일반적인 인터페이스입니다. 즉, 나오는 내용을 캐스팅해야하고 입력 한 내용을 조심해야합니다.
첫 번째로 무한 와일드 카드 매개 변수화 된 유형은 오브젝트와 다릅니다. 제네릭은 공 변하지 않습니다. 그래서 OP의 Java 예제에서 List<?>
은 List<Object>
과 같지 않습니다.기존 비 제네릭 컬렉션과 상호 작용할 때 예를 들어, 자바 List<?>
에 대한
// Unbounded wildcard type is not the same as Object...
List<?> unboundedList = new ArrayList<Object>();
List<Object> objectList = new ArrayList<Object>();
unboundedList = objectList; // no problems
objectList = unboundedList; // whoops! compile time error
유일한 사용 사례입니다. 컴파일러에서 unchecked conversion 경고를 피할 수 있습니다.
C#에는이 사용 사례가 없습니다. C# 제네릭은 지우개를 사용하여 구현되지 않았습니다. .net의 일반 콜렉션과 비 제네릭 콜렉션 간에는 하위 호환성이 없습니다. 코어 .net 라이브러리에 공존합니다. 이는 collection api의 generic 버전이 JDK 1.5의 비 generic 버전을 대체 한 Java와는 다릅니다.
그래서 C#에이 구조를 사용하려는 이유가 없다고 생각합니다. 동일한 방식으로 동작하는 직접적인 동일한 기능은 없습니다.
질문입니다. 이게 정말 좋은 생각입니까, 아니면 유형 안전성을 더 잘 보시겠습니까? –
목록
일부 컨텍스트를 갖는 것이 좋을 것입니다 ...이 선언에 대해 어디에서 사용하고 있습니까? –