Aynı yöntem ile bir sınıfta iki arabirim uygulamak. Arabirim yöntemi geçersiz kılınır?
Aynı yöntem adları ve imzaları ile iki arayüz. Ama derleyici arayüzü olan tanımlayacak o zaman nasıl tek bir sınıf tarafından uygulanan?
Ex:
interface A{
int f();
}
interface B{
int f();
}
class Test implements A, B{
public static void main(String... args) throws Exception{
}
@Override
public int f() { // from which interface A or B
return 0;
}
}
CEVAP
Eğer bir tür İki arayüzleri, ve interface
aynı olan bir yöntem tanımlamak her imza uygular, o an geçerli olan tek bir yöntem yoktur, ve ayırt edilebilir değildir. Diyelim, iki yöntemden çelişkili dönüş türleri varsa, o zaman derleme bir hata olacaktır. Bu genel kural, miras, yöntem geçersiz kılma, gizleme ve bildirimleri ve geçerlidir ayrıca Olası çatışma sadece 2 arasında kalıtsal interface
yöntem, aynı zamanda bir interface
süper class
yöntem, hatta sadece çatışmalar nedeniyle tip silme jenerik.
Uyumluluk örneği
İşte size bir örnek burada var interface Gift
, Bir present()
yöntem (hediyeleri takdim), ve aynı zamanda bir interface Guest
, aynı zamanda bir present()
yöntem (olarak, konuk mevcut değil, yok).
Presentable johnny
Gift
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 Pasajı derler ve çalıştırır.
Unutmayınsadece bir tane var@Override
!! gerekli!. Bu Gift.present()
Guest.present()
çünkü "@Override
eşdeğer" (JLS 8.4.2).
Böylece, johnny
sadece tek bir uygulaması vardırpresent()
ve ** 24, orada Gift
bir ya johnny
, nasıl davrandığın önemli değil olur çağırmak için tek yöntem.
Uyumsuzluk örneği
İşte iki devralınan yöntemleri @Override
eşdeğer OLMAYAN bir örnek:
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 da interface
bir üye devralmasını üye bildirimleri itaat genel bir kural gerektiğini yineledi. Biz Gift
Guest
uyumsuz dönüş türleri ile present()
define var burada: bir void
boolean
. Yapamazsın aynı sebeple bir yazın void present()
boolean present()
, bu örnek, bir derleme hatası oluşur.
Özet
@Override
eşdeğer yöntemler miras, yöntem geçersiz kılma ve saklanan her zamanki şartlara tabi olabilir. Onlar beri@Override
eşdeğer, etkili bir şekilde uygulamak için tek bir yöntem yoktur, ve bu nedenle ayırt etmek için bir şey yok/seçin.
Derleyici @Override
eşdeğer olduğu belirlenir belirlenmez sonra, aynı yöntem, çünkü onlar için arayüz tanımanızı yok.
Potansiyel uyumsuzlukları çözmek zor bir görev olabilir, ama bu tamamen başka bir konu.
Referanslar
- JLS 8.4.2 Method Signature
- JLS 8.4.8 Inheritance, Overriding, and Hiding
- JLS 8.4.8.3 Requirements in Overriding and Hiding
- JLS 8.4.8.4 Inheriting Methods with Override-Equivalent Signatures
- "Geçersiz imza ile eşdeğer birden çok yöntem devralan bir sınıf için mümkündür."
't neden C# Statik Yöntemler bir ...
Bir C# anonim sınıfı uygulamak bir ara...
Maymun bir yöntem yama, yeni uygulama ...
Neden Eclipse şikayet @arabirim yöntem...
Neden bir Numaralama bir Arabirim uygu...