Как опытный программист на c #, какие ловушки ждут меня в правилах вывода аргументов типа Java? - PullRequest
1 голос
/ 09 июня 2011

Или другими словами

В чем основное различие в выводе аргументов типа для универсальных типов между C # и Java?

Я являюсьищет ответ, который может быть прочитан и понят за несколько минут опытным разработчиком C #.

Ответы [ 2 ]

3 голосов
/ 09 июня 2011

Основное отличие между обобщениями Java & C # состоит в том, что обобщения Java применяются компилятором, при этом требуемый приведение вставляется соответствующим образом.Байт-код не ссылается на универсальный тип, это называется ' стирание типа '.

В C # универсальные шаблоны присутствуют на промежуточном языке, поэтому стирание отсутствует.В результате вы можете использовать отражение для чтения параметров универсального типа.

См. Этот связанный вопрос:

В чем различия между Обобщением в C # и Java ... и Шаблонами в C ++

2 голосов
/ 09 июня 2011

Меня больше всего смущает одна вещь: если параметр типа появляется только в возвращаемом типе, компилятор может вывести его из строя.

<T> T foo();

foo(); // fail, no idea what T is

Этот пример понятен, но следующее не

void bar(String s){..}

bar( foo() ); // fail, compiler can't infer T=String

Люди очень расстроены, что компилятор не может вывести простой случай, подобный этому.

Только в 2 контекстах (оба «преобразования назначения») Java может вывести T

String s = foo(); // ok, T=String

String doo()
{
    return foo(); // ok, T=String
}

(Хотя он компилируется, он очень опасен. Как, черт возьми, foo() знает, что он должен возвращать String? Из-за стирания типа у него нет доступа к T во время выполнения. Java будет лучше, если он не позволил сделать вывод даже в этих двух случаях.)

Конечно, когда вывод не удался, вы всегда можете предоставить параметр типа explicity.

...