web-dev-qa-db-ja.com

メソッドの戻り値の型として最も具体的な型を宣言する必要がありますか?

Android私はArrayListParcelableオブジェクトのうちIntentのみを配置できます

Intent putParcelableArrayListExtra(String name, ArrayList<? extends Parcelable> value);

List<? extends Parcelable>を入力できません。

ParcelableからIntentオブジェクトのリストを取得するprivateメソッドがあります(つまり、メソッドは独自のクラスで使用されます)。

先ほど言ったように、ArrayListには常にIntentがあります。このメソッドの戻り値の型をArrayList<>として宣言する必要がありますか?またはList<>

ArrayListArrayListでもあるので、Listの方が良いと思います。しかし、フィールドタイプを最も一般的な可能なタイプとして宣言する必要があることをよく読みます。 つまりCollection<>ではなくList<>(または、順序付けされたコレクションが必要な場合はArrayList<>)。しかし、このメソッドの戻り値の型に対してそうする理由は何もありません。

4
Leonid Semyonov

宣言(戻り値の型、APIコメント、またはコントラクトのいずれであるか)は、何らかの成果を上げるか、サービスを実行するという約束です。特定の戻り値の型を宣言することは、呼び出し側にとって十分な一般的な型を宣言するよりも大きな約束です。

それが本当にあなたがしていることである場合そして常にあなたがしていることになります、それで問題はありません。しかし、ある日、新しいより優れたコンテナタイプを含む方法でプログラムをリファクタリング、拡張、または改善したい場合、CoolNewList構造体に切り替えるとクライアントコードが破損するため、実行できません。 。次に、「ああ、私はStackExchangeで賢明な人々の話を聞いて、具体的な型を自慢するのではなく、最小限の約束をしたならいいのに!」と言いますが、それでは遅すぎます。次に、若いプログラマーに約束を最小限にとどめるようアドバイスし、ライフサイクルを続けます。

13
Kilian Foth