В Objective-C тип состоит из двух частей: 1) тип указателя класса (например, NSObject *
, NSString *
и т. Д.);это также может быть id
, который является специальным типом, который может принимать любой указатель объекта и отключает предупреждения компилятора статического типа для вызывающих методов;и 2) необязательно, один или несколько протоколов (которые похожи на интерфейсы в Java), которым объект соответствует (например, <NSCopying, NSCoding>
)
В Java ссылочным типом является либо имя класса, либо имя интерфейса.(Вы можете выбрать только один.) Между классами и интерфейсами не так много разделения.
В вашем случае тип указателя объекта - id
, который не выражает никакой информации, и вы указали один интерфейс, HTTPRequestDelegate
.Это может быть эквивалентно выражено в Java как
HTTPRequestDelegate delegate;
Если вы указали более одного протокола или указали фактический тип указателя класса плюс один или несколько протоколов, то ваш тип является «типом пересечения»,пересечение нескольких типов, которые вы указали.В этом случае это будет сложнее, потому что в Java нет простого способа выражения типов пересечений.(Хотя типы пересечения могут быть указаны в границах универсального типа, например, class Foo<T extends Collection & Comparable & CharSequence>
)
Кроме этого, единственное другое отличие между Objective-C и Java состоит в том, что в Objective-C вы можете отправлять любое сообщение (т.е. вызывать любой метод) для указателя объекта, и это разрешается, даже если статический тип переменной не указывает на то, что она поддерживается (компилятор выдаст предупреждение, если вы используете фактический тип указателя класса; если вы используете id
это не даст предупреждение).Я предполагаю, что это динамическая типизация, о которой вы говорите.В то время как в Java вы можете вызывать только те методы, которые, как известно, поддерживаются статическим типом во время компиляции.
Но если вы используете тип, такой как id<HTTPRequestDelegate>
, то есть вероятность, что вы намереваетесь тольков любом случае используйте методы, предоставляемые HTTPRequestDelegate
, чтобы не использовать никаких возможностей динамического набора текста.Таким образом, в Java достаточно только HTTPRequestDelegate.