Sadece dönüş türünü değiştirerek bir işlevi aşırı yüklemek neden mümkün değil? Bu, Java'nın gelecekteki bir sürümünde değişecek mi?
Bu arada, sadece referans için, bu C ++ 'da mümkün mü?
Sadece dönüş türünü değiştirerek bir işlevi aşırı yüklemek neden mümkün değil? Bu, Java'nın gelecekteki bir sürümünde değişecek mi?
Bu arada, sadece referans için, bu C ++ 'da mümkün mü?
Yanıtlar:
Bunu Java ile yapamazsınız ve C ++ ile yapamazsınız. Mantık, tek başına dönüş değerinin derleyicinin hangi işlevi çağıracağını bulması için yeterli olmamasıdır:
public int foo() {...}
public float foo() {..}
...
foo(); // which one?
float
, öyle double
.
foo();
Bir dönüş türünün belirsiz olacağı gerçeği, bir aşırı yükleme olarak buna izin vermemek için bir neden değildir. Belirsizliğe neden olabilecek argümanlar vardır (örneğin foo(null);
), ancak bu aşırı yüklemeyi doğal olarak geçersiz kılmaz.
Bunun nedeni, Java'daki aşırı yüklemelere yalnızca farklı imzalara sahip yöntemler için izin verilmesidir .
Dönüş türü yöntem imzasının bir parçası değildir, bu nedenle aşırı yükleri ayırt etmek için kullanılamaz.
Java eğitimlerinden Yöntemleri Tanımlama bölümüne bakın .
calculateAnswer(double, int, double, double)
". Dönüş türünün dahil edilmediğine bakın, @konmik.
Java 5.0'dan önce, bir yöntemi geçersiz kıldığınızda, hem parametreler hem de dönüş türü tam olarak eşleşmelidir. Java 5.0'da, kovaryant dönüş türü adı verilen yeni bir özellik sunar. Aynı imzaya sahip bir yöntemi geçersiz kılabilirsiniz, ancak döndürülen nesnenin bir alt sınıfını döndürür. Başka bir deyişle, bir alt sınıftaki bir yöntem, türü, üst sınıfta aynı imzaya sahip yöntem tarafından döndürülen türün bir alt sınıfı olan bir nesneyi döndürebilir.
Overloaded
argümanın da farklı olduğu göz önüne alındığında, java'daki yöntemlerin farklı dönüş türleri olabilir.
Örnek koda bakın.
public class B {
public String greet() {
return "Hello";
}
//This will work
public StringBuilder greet(String name) {
return new StringBuilder("Hello " + name);
}
//This will not work
//Error: Duplicate method greet() in type B
public StringBuilder greet() {
return new StringBuilder("Hello Tarzan");
}
}
Bir yöntemi aşırı yüklerken dönüş türü önemli değildir. Sadece belirsizlik olmadığından emin olmalıyız!
Java'nın hangi yöntemi çağıracağını bilmesinin tek yolu, argüman listesinin türlerini farklılaştırmaktır. Derleyici aynı ada ve aynı argüman türlerine sahip iki yönteme izin verirse, hangisini çağırması gerektiğini belirlemenin bir yolu olmazdı.
Derleyici yöntemleri farklılaştırırken dönüş türünü dikkate almaz, bu nedenle farklı bir dönüş türüne sahip olsalar bile aynı imzaya sahip iki yöntemi bildiremezsiniz.
İşlev yürütmenin farkındaysanız, bir işlevi çağırdığımızda tanım kısmının çalıştırıldığını ve sonunda return ifadesini istediğimizi fark edeceksiniz, bu nedenle return işlevin tüm tanımından sonra gelir diyebiliriz, bu yüzden iki veya aynı isimde ve aynı tipte ve no. işlev adı ve parametreler aynı olduğundan derleyicinin hangisinin çağrılacağını nasıl bileceği, argümanların sayısıdır. Çağırma sırasında öncelikle tüm odak argümanlar ve fonksiyon adı üzerinde olacak ve sonunda fonksiyon tanımının tamamlanmasından sonra return ifadesi ile ilgileneceğiz.
Derleme Süresi Hatası, Çalışma Süresi Hatasından daha iyidir. Bu nedenle, aynı parametrelere sahip aynı yöntemi bildirirseniz, java derleyici derleyici zamanı hatası oluşturur.
hayır, bu şekilde gerçekten mümkün değil, yalnızca hiçbir argüman veya argümanların veri türü ile aşırı yükleyebilirsiniz