2012-10-20 23 views
5

Powiel możliwe:
C# vs Java genericsTyp wymazywania: Java vs C#

Java użycie Typ wymazywania podczas C# przechowywać informacje typu w czasie wykonywania, jakie są praktyczne różnice w zachowaniach język z tego projektu?

+1

Look [tutaj] (http://stackoverflow.com/questions/355060/c-sharp-vs-java-generics) –

Odpowiedz

2

Oto przykład czegoś, co jest możliwe tylko wtedy, gdy informacja o typie jest utrzymywana w czasie wykonywania:

public string DoSomething<T>() 
{ 
    return typeof(T).Name; 
} 

Najbliższy można uzyskać w języku Java jest coś jak:

public <T> string DoSomething(Class<T> theClass) 
{ 
    return theClass.getName(); 
} 
1

coś, co dzieje się w Java ze względu na wymazywanie typów jest tworzeniem syntetycznych metod zwanych "metodami mostowymi".

Zwykle dzieje się tak, gdy Java próbuje skompilować klasę lub interfejs, który rozszerza sparametryzowaną klasę lub implementuje sparametryzowany interfejs. W tym przypadku kompilator Java może potrzebować stworzyć metodę syntetyczną (metodę mostu) jako część procesu usuwania typu, który pojawia się w śladzie stosu.

Kompilator robi to, aby zachować polimorfizm typów ogólnych po procesie usuwania tekstu.

Dokumentacja Java ma numer an example.

4

Istnieje wiele problemów z wymazywaniem typów. Przywraca złe wspomnienia. Nie używam Javy od 1.6, więc może to być nieaktualne, ale niektóre rzeczy, które pamiętam:

  1. Nie możesz utworzyć nowego T (lub zrobić coś, co wymaga wiedzy, jaki typ T faktycznie jest)
  2. Generic listy nie można utworzyć tablicę T
  3. nie można używać int, pływaka, etc w rodzajowych Java
    1. To ma implikacje wydajności i pamięci, ponieważ zawsze trzeba używać wersji sterty (Integer, itp.)
  4. Nie można zaimplementować ogólnego interfejsu z dwoma różnymi Ts, np. class c implements IComparable<MyClass>, IComparable<MyOtherClass> jest niemożliwe.
    1. Praktycznie nie można przeciążać metod o różnych rodzajach ogólnych, np. przez przyjęcie List<T1>, List<T2> i tak dalej. Na przykład, Java -- How to deal with type erasure in constructors?
  5. Wszystko odbywa się przez odlewanie i boks