aşırı fonksiyonlar compute1()
, compute2()
ve compute5()
neden derleme hatası bunları aşağıda kullanmaya çalışırsanız:Java: derleme zamanı çözünürlük ve "en özel yöntem"
package com.example.test.reflect;
class JLS15Test2
{
int compute1(Object o1, Integer i, Integer j) { return 1; }
int compute1(String s1, Integer i, int j) { return 2; }
int compute2(Object o1, Integer i, int j) { return 3; }
int compute2(String s1, Integer i, Integer j) { return 4; }
int compute3(Object o1, Integer i, int j) { return 5; }
int compute3(String s1, Integer i, int j) { return 6; }
int compute4(Object o1, Integer i, Integer j) { return 7; }
int compute4(String s1, Integer i, Integer j) { return 8; }
int compute5(Object o1, Integer i, Object j) { return 9; }
int compute5(String s1, Integer i, int j) { return 10; }
public static void main(String[] args)
{
JLS15Test2 y = new JLS15Test2();
// won't compile:
// The method compute1(Object, Integer, Integer) is ambiguous
// for the type JLS15Test2
// System.out.println(y.compute1("hi", 1, 1));
// Neither will this (same reason)
// System.out.println(y.compute2("hi", 1, 1));
System.out.println(y.compute3("hi", 1, 1));
System.out.println(y.compute4("hi", 1, 1));
// neither will this (same reason)
// System.out.println(y.compute5("hi", 1, 1));
}
}
JLS bölümü 15.12 okuduktan sonra "En spesifik yöntem" belirlerken, aşırı yüklenen yöntemlerin eşleştirilmesinde 2. aşamada (kutulama/kutucunun izin verilmiş olması, varargs olmaması) JLS, en spesifik yöntemin resmi parametreleri olan yöntem olduğunu anladığımı düşünüyorum uygulanabilir diğer yöntemlerin alt türleridir ve ilkel ve Nesneler (örn. int
ve Integer
) asla birbirinin alt türleri değildir. Yani Integer
Integer
bir alt-tipidir ve int
int
bir alt tipi olan, ancak Integer
ve int
/r/ton alt tip karşılaştırmaları ağırlık uyumlu, yani compute1()
/compute2()
çiftleri de en özel bir yöntem vardır.
(String
bağımsız değişken ile compute3()
ve compute4()
yöntem, Object
bağımsız değişkeni yöntem daha spesifik Oysa böylece programı baskılar 6 ve 8)
benim akıl doğru mu?
Kabul edildi, ancak ek bir aydınlanma görmek isterdim. –