Local-Variable Type Inference (LVTI) = Wnioskowanie o typie zmiennej lokalnej.
Źródło: https://openjdk.java.net/jeps/286
Java 10 Wprowadza nowy identyfikator var
, który nie jest słowem kluczowym, a jedynie nazwą zarezerwowaną, co oznacza, że var (teoretycznie) może być nazwą zmiennej, metody albo nazwą pakietu, ale nie może być nazwą klasy ani interfejsu.
Identyfikatorem var można oznaczać:
- zainicjalizowane zmienne lokalne (nie mogą być
null
) - indeksy w pętli
for
- indeksy w rozszerzonej pętli
for
W takich przypadkach typ zmiennej zostanie wywnioskowany w czasie kompilacji z kontekstu (czyli inicjalizatora).
Identyfikatorem var
nie można oznaczać np.:
- pól klas
- parametrów metod
- typów zwracanych
Zmienna oznaczona jako var
nie jest zmienną finalną, ale możemy do niej dodać słowo kluczowe final
.
final var person = new Person();
Zmienne oznaczone jako var
nie są zmiennymi dynamicznymi.
Uwaga: Nieprawdą jest, co podawane jest w dokumentacji Oracle, że w przypadku:
var list = new ArrayList<>();
wywnioskowanym typem list
będzie Object
. Pokazujemy to w przykładzie.
Klasa LocalVarTypeInfer
package locvartypeinfer; import math.MathUtil; import java.io.*; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.Arrays; public class LocalVarTypeInfer { private static final String[] LITERY = {"A", "Ą", "B", "C", "Ć", "D", "E", "Ę", "F", "G", "H", "I", "J", "K", "L", "Ł", "M", "N", "Ń", "O", "Ó", "P", "Q", "R", "S", "Ś", "T", "U", "V", "W", "X", "Y", "Z", "Ź", "Ż"}; public static void main(String[] args) { //- var litery = Arrays.copyOfRange(LITERY, 3, 8); MathUtil.print(litery); //- var inty = new int[]{1, 2, 3, 4}; MathUtil.print(inty); //- var stream1 = Arrays.stream(LITERY); var stream2 = Arrays.stream(litery); var stream3 = Arrays.stream(inty); //- try { var bytes = "W Strzebrzeszynie chrząszcz brzmi w trzcinie".getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // // var bytes1; // try { // bytes1 = "W Strzebrzeszynie chrząszcz brzmi w trzcinie".getBytes("UTF-8"); // } catch (UnsupportedEncodingException e) { // e.printStackTrace(); // } //var bytes2 = null //- for (var i = 0; i < inty.length; i++) { System.out.print(i + ", "); } for (var str : litery) { System.out.println(str + ", "); } //- try { URL url = new URL("https://bajki.blog/"); URLConnection conn = url.openConnection(); Reader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); } catch (IOException e) { e.printStackTrace(); } //- try { var url = new URL("https://bajki.blog/"); var conn = url.openConnection(); var reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); } catch (IOException e) { e.printStackTrace(); } //- var list = new ArrayList<String>(); System.out.println(list.getClass().getSimpleName()); list.add("Jacek"); System.out.println(list.get(0).getClass().getSimpleName()); //- var list1 = new ArrayList<>(); System.out.println(list1.getClass().getSimpleName()); list1.add("Placek"); System.out.println(list1.get(0).getClass().getSimpleName()); //- final var inty1 = new int[]{1, 2, 3, 4}; MathUtil.print(inty); } }
Wynik
Po uruchomieniu otrzymujemy:
[C, Ć, D, E, Ę] [1, 2, 3, 4] 0, 1, 2, 3, C, Ć, D, E, Ę, ArrayList String ArrayList String [1, 2, 3, 4]