2013-10-19 3 views
0

자바제한된 형태 변수 자바

에 다음 코드
List<? extends Number> list; 
list = new ArrayList<Float>(); 
list = new ArrayList<Integer>(); 
list.add(Float.valueOf("4.0")); // doesn't compile and it is fine 
Number e = list.get(0); // workds 
내가

List<SomeClass> list2 = new List<SomeClass>(); 
IEnumerable<Object> list3 = list2; // works 

나는 모든 인터페이스를 이해하고 어떤에서 C#에서 공변 유형에 대해 읽고 있었다

에 대한 C#에서 동등한 있는가/Java 클래스는 기본적으로 공분산을 지원합니다. 선언에 사용 된 유형 매개 변수에 따라 공분산을 따르지 않는 기능 (매개 변수화 된 유형을 입력으로 사용하는 메소드)은 지원되지 않습니다. 의미는 List<? extends Number>List<Integer> or a List<Double>의 참조를 취할 수 있지만 더 이상 add()와 같은 메소드를 지원하지 않습니다.

이제 C#의 다른면에서 공역을 지원하는 인터페이스를 찾아서 사용해야 할 것처럼 보입니다. 따라서 일반 클래스를 작성하려고 할 때마다 파생 클래스에 대한 모든 공변 연산을 지원하는 별도의 인터페이스를 작성하고 클래스가 해당 인터페이스를 구현하는지 확인해야합니다. 이게 맞습니까? 아니면 뭔가 빠져 있습니다.

감사

+1

당신 올바른지, 그리고 이것이 제네릭이 닷넷과 자바에서 구현되는 방식 때문이라고 생각합니다. 내가 올바르게 이해한다면, JVM 바이트 코드에는 제네릭이없고, 닷넷에서는 CIL로 구워진다. 각각의 컴파일러 구현은 이러한 사실을 기반으로하므로 Java 컴파일러는 프로그램에서 사용되는 코드 경로에만 * 유형 지우기 *를 수행하고 C# 컴파일러는 모든 사용 사례의 무결성을 보장해야합니다. 여기 실제 전문가의 정보 : http://stackoverflow.com/questions/339699/java-generics-type-erasure-when-and-what-happens. 게다가 C#의 기본 번호와 같은 것이 없습니다. – galenus

답변

1

귀하의 질문,
자바에서 다음 코드를 C#에서 동등한이 아니 기본 또는 수퍼 클래스 또는 인터페이스가 없기 때문에

List<? extends Number> list; 
    list = new ArrayList<Float>(); 
    list = new ArrayList<Integer>(); 
    list.add(Float.valueOf("4.0")); // doesn't compile and it is fine 
    Number e = list.get(0); // workds 

아니, 직접 상응이 없다 'Number'는 같지만 ('?'연산자의 일종), where 키워드가 있습니다.

msdn page에 관한 자세한 정보를 얻을 수 있습니다.

당신은 단순히 클래스의 변수이 인라인을 할 수

: 다른 측면에서,

이제

public class ArrayList<T> where T: someBaseClass 
{ 
    List<T> list = new List<DerivedTypeOfSomeBaseClass>(); 
} 

또는 기능

public T getArrayList<T>(ArrayList<T> arr) where T: someBaseClass 
List<T> list = new List<DerivedTypeOfSomeBaseClass>() 

귀하의 질문 안에 C#은 공변 (共 分散)을 지원하는 인터페이스를 찾아서 사용해야하는 것처럼 보입니다. 따라서 일반 클래스를 작성하려고 할 때마다 파생 클래스에 대한 모든 공변 연산을 지원하는 별도의 인터페이스를 작성하고 클래스가 해당 인터페이스를 구현하는지 확인해야합니다. 이 정확 아니면 내가 뭔가를 놓친 거지

공분산은 일반 매개 변수에 의해 지정된 것보다 더 파생 된 유형을 사용할 수있는 능력이 contravariance 덜를 사용할 수있는 능력 인 반면,이다, 공분산 및 contravariance 상태의 일반 개념 유도 유형.
공 공분산 및 Contravariance에 대한 자세한 내용은 MSDN link을 참조하십시오.
모든 공변 연산을 지원하는 공통 기본 인터페이스를 갖춰야하는 방식으로 일반을 통해이 작업을 수행하려는 경우에 맞습니다.

번호에 대한 특정 경우

모든 바이트, 더블, 플로트는 C#에서 짧은 정수, 긴,에서 IComparable, IFormattable, IConvertible,에서 IComparable, IEquatable 인터페이스를 구현, 첫 번째 질문에 대한 그래서

public class Program<K> where K : IComparable, IFormattable, IConvertible, IComparable<K>, IEquatable<K> 
{ 
    static void Main() 
    { 
     Program<int> pro = new Program<int>(); 
     Program<Byte> bpro = new Program<Byte>(); 
     Program<Double> dpro = new Program<Double>(); 
     Program<Int64> fpro = new Program<Int64>(); 
     Program<long> lpro = new Program<long>(); 
     Program<short> spro = new Program<short>(); 
    }