SORU
17 AĞUSTOS 2013, CUMARTESİ


&Quot;varsayılan" yöntem bir Arayüz içinde tanımlı uygulama nedir?

Toplama Arayüzü uygulaması içeren bir yöntem removeIf() adlı buldum.

default boolean removeIf(Predicate<? super E> filter) {
    Objects.requireNonNull(filter);  
    boolean removed = false;  
    final Iterator<E> each = iterator();   
    while (each.hasNext()) {  
        if (filter.test(each.next())) {  
            each.remove();  
            removed = true;  
        }  
    }  
    return removed;  
}  

Eğer bir arabirim yöntemi vücut tanımlamak için herhangi bir yolu varsa bilmek istiyorum?
default anahtar kelime nedir ve nasıl çalışır?

CEVAP
17 AĞUSTOS 2013, CUMARTESİ


Java 8 “Varsayılan Yöntem” ya da geliştirici arayüzü bu. mevcut uygulama bozmadan arabirimleri için yeni yöntemler eklemek için izin verir (Defans yöntemleri) yeni özelliğini tanıttı Esneklik arayüzü somut bir sınıf yöntemi için bir uygulama sağlamak için başarısız durumda varsayılan olarak kullanacağı uygulama tanımlamak olanak sağlar.

public interface A {
    default void foo(){
       System.out.println("Calling A.foo()");
    }
}

public class ClassAB implements A {
}

İnsanlar ilk kez yeni özelliği duyunca varsayılan yöntemleri hakkında sormak ortak bir soru var:

Eğer sınıf iki arabirimleri ve hem bu arabirimi uygulayan aynı imza ile varsayılan bir yöntem tanımlar?

Örnek bu durumu açıklamak için:

public interface A {  
    default void foo(){  
        System.out.println("Calling A.foo()");  
    }  
}

public interface B {
    default void foo(){
        System.out.println("Calling B.foo()");
    }
}


public class ClassAB implements A, B {

}  

Bu kod, aşağıdaki sonucu ile derleme başarısız:

java: class Clazz inherits unrelated defaults for foo() from types A and B

Bunu düzeltmek için, Clazz, el ile çakışan yöntem geçersiz kılma gidermek için var:

public class Clazz implements A, B {
    public void foo(){}
}

Ama yöntem foo varsayılan uygulama çağırmak istiyoruz (varsa) ne bizim kendi uygulamak yerine gelen arayüz.

Aşağıdaki gibi Bir#foo başvurmak mümkündür ()

public class Clazz implements A, B {
    public void foo(){
       A.super.foo();
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Caroline Martin

    Caroline Mar

    19 EYLÜL 2008
  • MrSuicideSheep

    MrSuicideShe

    9 NİSAN 2010
  • rekjavicxxx

    rekjavicxxx

    28 EKİM 2007