Vít Šesták: Nechápu, proč o tom píšete v budoucím čase a v podmiňovacím způsobu. Java 10 už je vydaná a to, co jsem napsal, použít můžete – jinak bych to sem nepsal. Zkuste si pod JDK 10 přeložit a spustit následující kód:
package test; import java.io.Serializable; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { var list = Main.createList(); var item = list.get(0); System.out.println(item); } private static <T extends Serializable & CharSequence> List<T> createList() { ArrayList<T> list = new ArrayList<>(); list.add((T) "0"); return list; } }
A nebo něco kratšího:
package test; import java.util.List; public class Main { public static void main(String[] args) { var list = List.of("0", new StringBuilder()); var item = list.get(0); System.out.println(item); } }
Na bajtkódu se nic nemění, odvozené typy lokálních proměnných jsou záležitost čistě syntaxe Javy a kompilátoru. Takže v bajtkódu bude přesně to samé, jako kdybyste do kódu nejpřesnější možný typ napsal sám, v tomto případě tedy Object
. Není to nic nového, generiky v Javě 5 byly také udělané tak, že se v bajtkódu nic nezměnilo a generické typy hlídal jen kompilátor.
Jak často se to bude používat nevím (ale tipl bych si, že např. díky List.of()
nebo Map.of()
docela často), ale je to jedno, protože kompilátor to musí umět, i kdyby se to používalo málo.