Bir tür iki arabirim uygular ve her biri interface
aynı imzası olan bir yöntem tanımlarsa, aslında tek bir yöntem vardır ve bunlar ayırt edilemez. Örneğin, iki yöntemin çakışan dönüş türleri varsa, bu bir derleme hatası olacaktır. Bu genel kalıtım kuralı, yöntem geçersiz kılma, gizleme ve bildirimlerdir ve sadece kalıtsal 2 interface
yöntem arasındaki olası çatışmalar için değil , aynı zamanda bir interface
ve bir süper class
yöntem veya hatta jeneriklerin silinmesi nedeniyle oluşan çatışmalar için de geçerlidir.
Uyumluluk örneği
Burada interface Gift
, bir present()
yöntemi olan (hediyeler sunulduğu gibi) ve ayrıca bir yöntemi interface Guest
olan bir de present()
(misafir olduğu gibi ve yok) olduğu bir örnek var.
Presentable johnny
hem a hem de Gift
a Guest
.
public class InterfaceTest {
interface Gift { void present(); }
interface Guest { void present(); }
interface Presentable extends Gift, Guest { }
public static void main(String[] args) {
Presentable johnny = new Presentable() {
@Override public void present() {
System.out.println("Heeeereee's Johnny!!!");
}
};
johnny.present(); // "Heeeereee's Johnny!!!"
((Gift) johnny).present(); // "Heeeereee's Johnny!!!"
((Guest) johnny).present(); // "Heeeereee's Johnny!!!"
Gift johnnyAsGift = (Gift) johnny;
johnnyAsGift.present(); // "Heeeereee's Johnny!!!"
Guest johnnyAsGuest = (Guest) johnny;
johnnyAsGuest.present(); // "Heeeereee's Johnny!!!"
}
}
Yukarıdaki kod parçası derlenir ve çalışır.
Sadece bir tane @Override
gerekli olduğunu unutmayın !!! . Bunun sebebi Gift.present()
ve Guest.present()
" @Override
eşdeğerdir" ( JLS 8.4.2 ).
Böylece, johnny
tek bir uygulama vardır ve present()
, ve bunu nasıl ele fark etmez johnny
ister bir şekilde, Gift
ya da bir şekilde Guest
, çağırmak için tek bir yöntem yoktur.
Uyumsuzluk örneği
Aşağıda, devralınan iki yöntemin DEĞİL olduğu bir örnek verilmiştir @Override
:
public class InterfaceTest {
interface Gift { void present(); }
interface Guest { boolean present(); }
interface Presentable extends Gift, Guest { } // DOES NOT COMPILE!!!
// "types InterfaceTest.Guest and InterfaceTest.Gift are incompatible;
// both define present(), but with unrelated return types"
}
Bu ayrıca üyelerin bir üyeden miras interface
alınmasının üye beyanlarının genel kuralına uyması gerektiğini de yineler . Burada uyumsuz dönüş türlerine sahibiz Gift
ve Guest
tanımladık present()
: biri void
diğeri boolean
. Aynı türde bir void present()
ve bir arada olamaz boolean present()
, bu örnek bir derleme hatasıyla sonuçlanır.
özet
@Override
Eşdeğer olan yöntemleri, geçersiz kılma ve gizleme yöntemlerinin olağan gereksinimlerine tabi olarak devralabilirsiniz . Onlar bu yana OLAN @Override
-eşdeğer etkin uygulamak için yalnızca bir yöntem yoktur ve dolayısıyla seçim / ayırt etmek bir şey yok.
Derleyicinin hangi yöntem için hangi arabirim olduğunu tanımlaması gerekmez, çünkü bir kez @Override
eşdeğer olduklarına karar verildikten sonra aynı yöntemdir.
Potansiyel uyumsuzlukları çözmek zor bir iş olabilir, ancak bu tamamen başka bir konudur.
Referanslar