Zielony Smok - logo witryny

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]