Por que a assinatura do método precisa corresponder perfeitamente ao método da interface

Comecei a aprender o Go e não consigo entender o seguinte:

package main

import "fmt"

type I interface {
    foo(interface {})
}

type S struct {}

func (s S) foo(i int) {
    fmt.Println(i)
}

func main() {
    var i I = S{}
    i.foo(2)
}

Isso falha com:

cannot use S literal (type S) as type I in assignment:
        S does not implement I (wrong type for foo method)
                have foo(int)
                want foo(interface {})

Não entendo por que o Go não aceita ofoo(int) assinatura dado o fato de queint implementainterface {}. Alguém pode ajudar com uma explicação?

questionAnswers(2)

yourAnswerToTheQuestion