16 Aralık 2019 Pazartesi

var Tipi

Giriş
Java 10 JEP 286: Local-Variable Type Inference ile geliyor. Java dili C++ ve C#'taki bu özelliği nihayet yakalayacak.

var Anahtar Bir Kelime Değil
Açıklaması şöyle.
not a keyword; instead it is a reserved type name.
Açıklaması şöyle. Sadece derleme esnasında kullanılır.
As a 100 percent compile feature, it doesn't affect bytecode, runtime, or performance. Mainly, the compiler will inspect the right-hand side and infer the concrete type. It looks at the right-hand side of the declaration, and if there is an initializer, then it simply uses that type to replacevar.

Örnek
var isimli bir değişken tanımlanabilir. Şöyle yaparız.
public class Java10 {
  var var = 42; // <-- this works
}
var null ile İlklenmez
Örnek
Şu kod derlenmez.
var x = new HashMap<> (); // legal
var y = new HashMap<String, Integer>(); // legal

var z = "foo"; // legal
System.out.println(z);

var umm = null;  // xx wrong xx //
var foo; // xx wrong usage without initializer xx //

var var = 5; // legal
Local Type Inference yerel değişkenler için kullanılır.
Örnek
Şöyle yaparız.
var foo = "boo";
Örnek
Şöyle yaparız.
public class TestClass {
  public static void main(String [] args){
    var list = new ArrayList<>();
    list.add("1");
    System.out.println(list.get(0)); // 1
  }  
}
Şu kod yerel değişken olmadığı için derlenmez.
public class TestClass {
  public var list = new ArrayList<>();
  public static void main(String [] args){
    ...
  }
}
Örnek
Generic tipler kullanılabilir. Şöyle yaparız. Eğer her iki tarafta da tip verilmezse en generic tip seçilir.
var list = new ArrayList<>(); // Infers ArrayList<Object>
var list = new ArrayList<>(List.of(1, 2, 3)); // Infers ArrayList<Integer>
Non-Denotable Type
Açıklaması şöyle. Yani var Anonymous Class muamelesi görebilir.
Capture variables, and types with nested capture variables, are projected to supertypes that do not mention capture variables. This mapping replaces capture variables with their upper bounds and replaces type arguments mentioning capture variables with bounded wildcards (and then recurs). This preserves the traditionally limited scope of capture variables, which are only considered within a single statement.
Örnek
Şöyle yaparız.
var d = new Object() {};  // d has the type of the anonymous class
Örnek
Şöyle yaparız.
var x = new Object() {
    int i = 10;
};

System.out.println(x.i); // works; `x` has the non-denotable type of the annonymous class
Şu kod ise delenmez.
List<String> l1 = new ArrayList<>();
l1.add("Hello");
List<?> l2 = l1;
var l3 = l2; // type of 'l3' is List<?>, but not the same '?' as 'l2'

l3.add(l2.get(0)); // error
Örnek
Şöyle yaparız
var object = new Object() {
    public void a() {}
};
object.a();
lambda ile kullanılamaz
Açıklaması şöyle.
The inference process, substantially, just gives the variable the type of its initializer expression. Some subtleties:
  • The initializer has no target type (because we haven't inferred it yet). Poly expressions that require such a type, like lambdas, method references, and array initializers, will trigger an error.
Şu kod derlenmez.
var predicateVar = apple -> apple.getColor().equals("#101094");
Local-Variable Syntax for Lambda Parameters
var lambda parametresi olarak kullanılabilir.
Örnek
Şöyle yaparız. Böylece lambda değişkenlerde anotasyon kullanılabilir.
Prediciate<String> predicate = (@NotNull var a) -> true;
Örnek
Şöyle yaparız
(@NotNull var str) -> "$" + str

Hiç yorum yok:

Yorum Gönder