javaの型安全と多態性についての質問です。
勉強していて、相反する(あるいは相反し得る)考えだと思ったのですが、皆様はどのようにお考えなのかと思い、質問させていただきます。
多態性は変数やインスタンスを曖昧に捉えることで、メリットを得ようとする考え方です。
例えば、コレクションの中身を表示するようなメソッドがあったとして、
public void prints(List<String>) {};
public void prints(ArrayList<String>) {};
上ではArrayListもLinkedListでも同様に表示できますが、下ではArrayListしか表示させることができません。
また、コレクションを宣言するときは
List<String> names = new ArrayList<String>();
のように書くことが推奨されています。
一方、型安全はこれとは逆に変数には可能な限り厳密な型を指定しようという考え方です。
public void prints(String a, int b){};
のようなメソッドを
public void prints(Object a, Object b){};
のように書いてしまうと、
prints("ああ",3);
と呼ばなければならないところを
prints(3,"ああ");
と書いてしまった時にコンパイルエラーが出ず、実行する時にエラーが出るようになり、望ましくありません。
上記の例を見ていると、多態性は曖昧に捉えることでメリットを得ているのに対し、型安全では厳密に捉えた方が良いとということがわかります。
この二つって相容れないものだと思うのですが、実際どうなんでしょうか。
これに対する皆さんの考えを教えてください。
補足
なんだか意図がうまく伝わっていない気がしたので、補足しておきます。
型安全は型によって、安全を担保しようという考え方で、enumやジェネリクスもこれに当たります。
enumによって、ある型に入れることのできる候補というのは制限することができますし、ジェネリクスも同様で、ArrayList<String>だとString型しか入りません。
一方、多態性はアップキャストすることによるメリットを享受しようという考えに基づいています。
まとめると、多態性は曖昧に捉えており、型安全は厳密に範囲を狭めているということになるわけですが、これらのコンセプトって相容れないものだと思うのです。
しかしながら、現実のプログラミングにおいて、この二つの考えって共存しているとは思うのですが、一つの部分(ステートよりもさらに小さな単位で、例えば評価式)に着目してみると、どちらかしか使ってないと思うのです。
つまり、多態性と型安全の両方のコンセプトを一つ部分に取り込むことはできないと思うのですが、その使い分けについて、教えてくださいというのが私の質問だったのです。
書き方が悪かったですね。
申し訳ないです。
回答4件
あなたの回答
tips
プレビュー