型を消す

2018/01/30

親クラスはジェネリクスをもたない。メソッドがジェネリクスになっている。
子クラスはジェネリクスになっている。

書いてみた。実行時エラーになるのはいやだ。。

import Foundation

class A {
    let b:B
    init<T>(_ v:T) {
        self.b = C(v)
    }
    
    /// 問題点 なんでも良いことになってしまっている。
    func get<T>() -> T {
        return b.get()
    }
}

class B {
    func get<T>()->T {
        let this = self as! C<T>
        return this.get()
    }
}

class C<T> :  B {
    let v:T
    
    init(_ v:T) {
        self.v = v
    }
    
    func get()->T {
        return v
    }
}

func sample() {
    let a = A("Hello")
    let b = A(3)
    
    let c:String = a.b.get()
    let d:Int = b.b.get()
    
    let e:Int = a.b.get() // 実行時エラーになる。。orz
    
    
}