Skip to content

Latest commit

 

History

History
43 lines (33 loc) · 2.08 KB

Covariant generics.md

File metadata and controls

43 lines (33 loc) · 2.08 KB

Covariant generics

Статус Ожидание Реальность
🚫 При указании ключевого слова out на generic-е, сгенерируется generic со схожим поведением (ковариантный generic) Не работает как ожидается, приходится использовать приведение типов

Пояснения

В Kotlin–е ключевое слово out определяет ковариантный generic, который может производить данные.

class OutGeneric<out T>(data: T) {  
    val myState = data  
    fun pullState(): T = myState  
}  
  
private fun example(param: OutGeneric<String>) {  
    val t: OutGeneric<Any> = param    // без out-а не компилируется  
}

В Objective-C есть указание на то, что generic - ковариантный:

__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("OutGeneric")))
@interface HHMSOutGeneric<__covariant T> : HHMSBase
- (instancetype)initWithData:(T _Nullable)data __attribute__((swift_name("init(data:)"))) __attribute__((objc_designated_initializer));
- (T _Nullable)pullState __attribute__((swift_name("pullState()")));
@property (readonly) T _Nullable myState __attribute__((swift_name("myState")));
@end;

Но в Swift-е эта ковариантность теряется, приходится использовать приведение типов:

private func outGenericUsage(generic: OutGeneric<NSString>) {
	let _: OutGeneric<AnyObject> = generic as! OutGeneric<AnyObject>
}

Оглавление