7 Haziran 2021 Pazartesi

Poly Expression

Giriş
Bir expression'ın sonucu ya void ya da belirli bir tip olmalıdır. Bazen bu tip bir anlamda esnetilir ve derleyicinin karar vermesi istenebilir. Poly Expression sanırım sadece generic kodlarda devreye girer.

Örnek
Elimizde şöyle bir kod olsun.
var intSet1 = Set.of(123, 1234, 101);
var strValue = "123";
isValid(strValue, intSet1);// Compilation error (Expected behaviour)

static <T> boolean isValid(T value, Set<T> range) {
  return range.contains(value);
}
Bu kod derleme hatası verir çünkü String ve Integer farklı tiplerdir. isValid() metoduna birlikte geçilemezler.
Bu kod şöyle olsun.
var strValue = "123";
isValid(strValue, Set.of(123, 1234, 101));// No Compilation error**

static <T> boolean isValid(T value, Set<T> range) {
  return range.contains(value);
}
Bu sefer derleme hatası almayız. Açıklaması şöyle. Çünkü isValid() metoduna geçilen her iki parametrenin de ortak arası olan Serializble kullanılır. 
With isValid(strValue, intSet1);, you're calling isValid(String, Set<Integer>), and the compiler does not resolve T to the same type for the two arguments. This is why it's failing. The compiler simply can't change your declared types.

With isValid(strValue, Set.of(123, 1234, 101)), though, Set.of(123, 1234, 101) is a poly expression, whose type is established in the invocation context. So the compiler works at inferring T that is applicable in context
Yani kod şu hale gelirr
static boolean isValid(Serializable value, Set<Serializable> range)

Hiç yorum yok:

Yorum Gönder