2016-03-20 11 views
0

Son birkaç gündür kafamı bu sorun üzerinde becermeye çalıştım ve hiçbir şey düşünemediğim her şeyi araştırıyorum.Arabirimi kendi dönüş tipiyle aradığınızda Java türü uyuşmazlığı?

Arabirim aracılığıyla başka biriyle etkileşimde bulunan bir sınıfa sahibim. Bana yeterince basit görünen kod ile bazı tür uyumsuzluk hataları alıyorum.

public class FooBar { 
    Foo<? extends Bar> X = new Y(); 

    public void test(){ 
    if X.isA(X.B()){ 
     //do something; type mismatch here 
    } 

    } 
} 

Arayüz:

public interface Foo<T extends Bar> { 
    public T B(); 
    public boolean isA(T t); 
} 

Uygulama: konunun

public class Y implements Foo<T extends Bar> { 
    public int B(){ 
    return 5; 
    } 

    public boolean isA(int num){ 
    int A = 10; 
    return (A == num) ? true : false; 

} 

Demek istediğim yöntemi testidir(). Arabirim üzerinden bir sayı alıyorum, ardından uygulama sınıfının aynı örneğiyle test ediyorum, ancak bu bana bir yakalama/tür uyuşmazlığı hatası veriyor.

CAP # 1, Bar'ın yakalanmasını? Bar

'u genişletir CAP # 2 Barın yakalanmasını kapar? Bar

Aramalarımda bulduğum birçok şeyi denedim, ancak bunların hiçbiri işe yaramadı. Jenerik ve arayüzler benim için yeni ve hala onları öğreniyorum. Şimdiden herhangi bir yardım için teşekkür ederiz!

+3

'yerine' int' ait 't' almak isA' gerekmez mi? Veya sınıfın imzası "public class Y" olarak değiştirildi. Foo ' –

+1

Bir yan not olarak dönüş (A == num)? true: false; '' return A == num; ' – Guy

+0

Bar sınıfı nerede? – pczeus

cevap

0

Sınıflarınızı güncelledim (ve netlik için eksik Bar sınıfını ekledim). Artık FooBar.main() yöntemini çalıştırmak ve beklediğiniz sonuçları elde edebilirsiniz:

public class FooBar { 
    Foo x = new Y(); 

    public void test(){ 
     if(x.isA(x.B())){ 
      System.out.println("x.isA!"); 
     } 
    } 

    public static void main(String... args){ 
     FooBar fb = new FooBar(); 
     fb.test(); 
    } 
} 

public interface Foo<T extends Bar> { 
    T B(); 
    boolean isA(T t); 
} 

public class Bar {} 

public class ExtendsBar extends Bar { 

    @Override 
    public String toString(){ 
     return "Yes I extend Bar"; 
    } 
} 

public class Y implements Foo<ExtendsBar> { 
    public ExtendsBar B() { 
     return new ExtendsBar(); 
    } 

    public boolean isA(ExtendsBar num) { 
     return (num instanceof Bar); 
    } 
}