LoginSignup
0
0

ジェネリクスが便利

Last updated at Posted at 2019-11-15

##ジェネリクス
を知りました、便利ですねこれ

##具体例

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の項目を増やせばわりと汎用的になるかと

型の入り口が広いほど予期せぬエラーの発生の元なので
使うときは結構注意するべきかもですね

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0