No właśnie Javowe generyki nie obsługują prymitywów, dlatego że prymitywy nie są obiektami. W C# to osiągnięto, bo zarówno struktury, jak i klasy znajdują się w jednej hierarchii dziedziczenia.
somekind znawca Javy znowu swoje. Hierarchia typów nie ma tu nic do rzeczy, bo istnieje tylko na etapie kompilacji (w sensie to niby dziedziczenie inta po objekcie), a do generyków na typach wartościowych potrzebne jest wparcie VMki. Javowa VMka praktycznie w ogóle nie wspiera generyków (jedyne wsparcie to zapisywanie w plikach .class informacji o generykach, które są dostępne statycznie w kodzie źródłowym). Dodanie wsparcia dla typów wartościowych i generyków je obsługujących jest w zakresie projektu Valhalla: http://openjdk.java.net/projects/valhalla/
Dziedziczenie po typie object w C# jest pewnego rodzaju iluzją, bo oznacza co najwyżej tyle, że na instancji typu można odpalić metody z klasy object (ToString, HashCode, etc). Jeśli mamy zmienną typu object w rzeczywistości chodzi natomiast o typ referencyjny, a nie dziedziczący po object. Z tego powodu przypisanie inta do zmiennej typu object powoduje boxing (opakowanie zmiennej wartościowej w zmienną referencyjną).
Hierarchia typów to jest coś banalnego do osiągnięcia - twórcy Javy mogliby bez problemu sprawić że 5 instanceof Object
zwraca true
(w taki sam sposób jak to się dzieje w C#, czyli wbijanie tego true
na sztywno do bajtkodu na etapie kompilacji), ale po co, skoro samo w sobie to nic nie daje (a moim zdaniem wprowadziłoby to tylko zamieszanie)?
Iluzję z C# można zaprezentować na wiele sposobów. Kiedyś podawałem przykład narzutu przy wrzucaniu intów do List<object>
- inty były opakowywane w typ referencyjny (który lubię nazywać dużym intem). Inny sposób na wykazanie niekompatybilności inta z objectem to np przypisanie tablic. Tablice w Javie i C# są kowariantne (to jeden z błędów Javy, który C# bezmyślnie skopiował), więc tablica podtypów powinna dać się przypisać do zmiennej o typie tablicy nadtypów. Tak się jednak nie dzieje jeśli pomieszamy typy wartościowe z referencyjnymi: https://www.ideone.com/cJgMgT
using System;
public class Test
{
public static void Main()
{
object[] objects = null;
int[] ints = null;
string[] strings = null;
// this works because arrays are covariant
objects = strings;
// this doesn't work because we're mixing reference types with value types
objects = ints;
}
}