import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class InferensiDiamon {
    // Target typing dari tipe kembalian: T pada ArrayList<> disalin dari List<String>
    static List<String> buatNama() {
        return new ArrayList<>();
    }

    public static void main(String[] args) {
        // Gaya sebelum Java 7: type argument ditulis dua kali
        Map<String, List<Integer>> gayaLama = new HashMap<String, List<Integer>>();

        // Diamond sejak Java 7: type argument disalin dari variabel
        Map<String, List<Integer>> gayaBaru = new HashMap<>();

        // var sejak Java 10: tipe variabel pun disimpulkan dari kanan
        var nama = new ArrayList<String>();

        // Target typing pada generic method pustaka standar
        List<String> kosong = Collections.emptyList();

        gayaLama.put("Budi", List.of(80));
        gayaBaru.put("Siti", List.of(90, 95));
        nama.add("Dewi");

        System.out.println("Lama   : " + gayaLama);
        System.out.println("Baru   : " + gayaBaru);
        System.out.println("var    : " + nama);
        System.out.println("Method : " + buatNama().getClass().getSimpleName());
        System.out.println("Kosong : " + kosong.isEmpty());
    }
}
