##ジェネリクス
を知りました、便利ですねこれ
##具体例
Test2.java
package test1;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class Test2 {
public static void main(String[] args) {
createList("e").forEach(Test2::echo);
createMap("a", 1).entrySet().forEach(Test2::echo);
try {
echo(nullToBlank(null));
echo(nullToBlank("a"));
echo(nullToBlank(1));
} catch (NotStringException e) {
e.printStackTrace();
}
}
private static <T> void echo(T t) {
System.out.println(t);
}
private static <T> List<T> createList(T t) {
List<T> list = new LinkedList<>();
list.add(t);
return list;
}
private static <K, V> Map<K, V> createMap(K key, V value) {
Map<K, V> map = new HashMap<>();
map.put(key, value);
return map;
}
private static <T> String nullToBlank(T t) throws NotStringException {
if (t == null) {
return "";
} else if (t instanceof String) {
return t.toString();
} else {
throw new NotStringException("nullでも文字列型でもありません");
}
}
private static class NotStringException extends Exception{
private static final long serialVersionUID = 1L;
private NotStringException(String msg) {
super(msg);
}
}
}
ひとつずつ見ていきましょう
###echo
echo.java
private static <T> void echo(T t) {
System.out.println(t);
}
型が何でもいいってことですね
引数の型、普通ならStringとかのとこがTになってます
そのかわり、急にTとか言われてもわからんので, 今からTつかうよーって宣言で
voidの前にが入ってます
###createList
createList.java
private static <T> List<T> createList(T t) {
List<T> list = new LinkedList<>();
list.add(t);
return list;
}
リストなどの型にもジェネリクスが使えますね
以上
###createMap
createMap.java
private static <K, V> Map<K, V> createMap(K key, V value) {
Map<K, V> map = new HashMap<>();
map.put(key, value);
return map;
}
2つ同時にジェネリクスを使えます
大文字から始まる単語なら何でもいいので好きな文字使ってくださいな
慣例として不文律的な物があるらしいんですけど知りたかったらググってください
###nullToBlank
nullToBlank.java
private static <T> String nullToBlank(T t) throws NotStringException {
if (t == null) {
return "";
} else if (t instanceof String) {
return t.toString();
} else {
throw new NotStringException("nullでも文字列型でもありません");
}
}
private static class NotStringException extends Exception{
private static final long serialVersionUID = 1L;
private NotStringException(String msg) {
super(msg);
}
}
型が何でもいい引数に対して
-> nullなら空文字を返す
-> 型がStringならそのままの値を返す
-> Stringでもnullでもなければ例外を投げる
ってメソッドです
まぁまぁ便利そうですよね
nullチェックをしたいときにinstanceofの項目を増やせばわりと汎用的になるかと
型の入り口が広いほど予期せぬエラーの発生の元なので
使うときは結構注意するべきかもですね