Soyut bir getType() yöntemine sahip bir temel sınıfım var. Bu yöntemi uygulayabilmek ve kullanılacak asıl sınıfı sağlamak için alt sınıflar istiyorum. kodundaYuvalanmış sınıf türünü Java'ya döndürme
, aşağıdaki gibi bir şey:
public abstract class A {
public static interface Tile;
protected abstract Class<Tile> getTileClass();
}
public class B extends A {
public static class MyTile implements A.Tile { }
@Override
protected abstract Class<A.Tile> getTileClass() {
MyTile t = new MyTile(); // WORKS
return MyTile; // ERROR HERE
}
}
Buradaki sorun ben işaretlenmiş doğrultusunda "MyTile çözülemeyen" elde ediyoruz. getClass()
dönüş yeni MyTile() ama şimdi Eclipse bana söyler:. Bu yüzden bu yerine dönmek çalışıyorum
tür uyuşmazlığı: dan dönüştüremiyor Sınıf
<
yakalama # 1-in? B.MyTile>
Sınıf<
belki burada Eclipse bir hata üst varsa bile emin değilimA.Tile
>
kadar uzanır (yakalama 1.?).Sonra, ben arayüzleri vazgeçmek ve soyut bir taban Çini sınıfını kullanmaya çalışıyorum.)
1 bu A ile çalışmak için mümkün mü:
public abstract class A { public static abstract class Tile; protected abstract Class<? extends Tile> getTileClass(); } public class B extends A { public static class MyTile exends A.Tile { } @Override protected abstract Class<? extends A.Tile> getTileClass() { return new MyTile().getClass(); // WORKS return MyTile; // "Cannot be resolved" } }
Yani temelde üç soru var gibi: Eclipse bazı yardımıyla, ben derlemek görünüyor aşağıdaki kodla sona .bir arayüz olarak?
2) bir temel sınıf kullanırken, gerçekten
Class<? extends X>
gitmek doğru yolu nedir?3) Ve nasıl yönteme içinden benim iç içe B.MyTile sınıf referansı dönebilir?
new MyTile().getClass()
yapmak zorunda olmak doğru olamaz mı?
Muhtemelen yansıtıcı olmayan bir nesne yerine bir 'Class' döndürmek kötü bir fikirdir. –
@Tom İşaretli türler bağlamında bir Sınıf Dönen çok yaygın bir desendir; bu, örneğin bir koleksiyonun * kontrol edilen * türünü çalışma zamanında kontrol etmenizi sağlar. Başka hiçbir şekilde bilmiyorum, aslında ... –
Varkhan