javaでは、一般的に動的な型を使わないです。
なので、今回の例だとメソッドを2つ書きます。
if文の分岐の中を別に書くだけなので、特に難しくないとおもいます。
メンテナンスも、if文の中を読まなくてもメソッド単位で探せるので、こちらの方が楽です。
java
1public static void main(String[] args) {
2 Test hoge = new Test();
3
4 List<String> sList = hoge.addString();
5 System.out.println(sList);
6
7 List<Integer> iList = hoge.addInt();
8 System.out.println(iList);
9}
10
11public List<String> addString() {
12 List<String> list = new ArrayList<>();
13 list.add("hoge");
14 list.add("fuga");
15
16 return list;
17}
18
19public List<Integer> addInt() {
20 List<Integer> list = new ArrayList<>();
21 list.add(1);
22 list.add(2);
23
24 return list;
25}
26
あと型がString or Intのみ
ということが分かっていた場合に、これらのどちらかの型に制約できるのでしょうか?
上記のメソッド以外は存在しないので、呼べません。(コンパイルエラー)
どうしても1つのメソッドでやりたいなら、ワイルドカードというのがあります。
java
1public static void main(String[] args) {
2 Test hoge = new Test();
3
4 List<?> sList = hoge.add("string");
5 System.out.println(sList);
6
7 sList = hoge.add("int"); // ワイルドなので、代入可能
8 System.out.println(sList);
9
10 sList = hoge.add("empty");
11 System.out.println(sList);
12}
13
14public List<?> add(String str) {
15 if ("string".equals(str)) {
16 List<String> list = new ArrayList<>();
17 list.add("hoge");
18 list.add("fuga");
19
20 return list;
21 }
22
23 if ("int".equals(str)) {
24 List<Integer> list = new ArrayList<>();
25 list.add(1);
26 list.add(2);
27
28 return list;
29 }
30
31 return new ArrayList<>(); // return null;
32}
33
とはいえ、型定義がList<?>なので、自前でCastしないといけないし
型が違えば例外が発生するしで使いにくくて仕方ありません。
まぁ、型付けの厳しい言語への慣れなので好みとも言えますが。
ご提示の
public <T> List<T> add(String str)
を使う場合は、どうしてもワーニングは防げないです。
また、実際に以下のように呼び出しても
java
1List<Integer> iListFake = hoge.add("string");
2System.out.println(iListFake.get(0).doubleValue());
3
Integerが入ったListでなく、Stringが入ったListが返ってくるので
コンパイルエラーになりませんが、実行時に例外(ClassCastException)が発生します。
なので、javaの場合は、おとなしく2つのメソッドに分けた方が良いと思います。
2つにわけるのはよいが、どうしても同じ名前を使いたい場合は、引数に型を指定するのも
まぁありかと思います。(正直ダサいと思いますが)
java
1public List<String> add(String s)
2public List<Integer> add(int i)
3