# インスタンス属性`hoge`の型がなんであるかはコンストラクタ引数に # 渡された`hoge`引数の型で決まることを型チェッカーに伝える class Foo(Generic[_T]): hoge: _T def __init__(self, hoge: _T) -> None: ... # この関数が返す型がなんであるかは引数に渡されたシーケンスの型引数が # 何型かで決まることを型チェッカーに伝える def get_first(seq: Sequence[_T]) -> _T: return seq[0] 上記のコードでは、グローバルに宣言した_Tをまったく違う意味として使えてしまっています。 つまり、ひとつの型変数に過剰な責任が載せられてしまっています。 もちろん、別々の名前で宣言することで、意味が違うことを強調し、責任を分散させることもできます。 しかし、ジェネリッククラス、関数