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.
Bu kod derleme hatası verir çünkü String ve Integer farklı tiplerdir. isValid() metoduna birlikte geçilemezler.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 şöyle olsun.
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.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);}
Yani kod şu hale gelirrWith 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.
static boolean isValid(Serializable value, Set<Serializable> range)
Hiç yorum yok:
Yorum Gönder