[swift-users] How do generics interact with overloaded methods?

Ryan Conway theconmethod at gmail.com
Thu Jan 14 01:04:57 CST 2016


Hey swift-users,

I'm teaching myself Swift, coming from a mostly C and Python background,
and would like to understand generics more deeply. Right now, I'm seeing
generic data types invoke overloaded methods in ways I do not understand,
and am seeking clarification why.

In an effort to model a data structure whose data can be represented as
multiple data types simultaneously, I've made this class. Here its
implementation is mocked using constants.

class Bar {
    func read() -> Int {
        return -1
    }
    func read() -> UInt {
        return 1
    }
    func read<T>() -> T {
        print("Unsupported data type requested")
        exit(1)
    }
}


Objects of that class return the requested type as expected when used like
so:

let thisWorks: Int = Bar().read() // returns -1
let thisAlsoWorks: UInt = Bar().read() // returns 1


However, when I introduce generics on top of that class, the expected
method (the "most precise" method) is not called. For example, given this
other class:

class Baz<T> {
    let myBar = Bar()

    func read() -> T {
        return self.myBar.read()
    }
}


Both of these invocations call the generic read<T>() -> T method rather
than the read() -> UInt method:

let thisDoesntWork = Baz<UInt>().read()
let thisDoesntWorkEither: UInt = Baz<UInt>().read()


Am I using generics wrong here? Is there some other language feature I
should be using to capture this data? Any pointers would be greatly
appreciated.

Thank you,
Ryan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20160113/287fea96/attachment.html>


More information about the swift-users mailing list