Tanım nesnesine başvuru içeren bir nesne örnekleri sistemim var. Her miras ağacı için üst düzey bir sınıfım var. Örnek nesnesi, karşılık gelen tanım sınıfına genel bir başvuruyu içerir.Bu jenerik neden üst sınıf sınırını (Java) tanımıyor?
Geterdeki jenerikleri kullanarak, üst düzey nesnenin bir alt sınıfı, döküm yapmadan doğru tür tanımını alabilir. Ancak, soyut bir alt sınıf tekrar edemez sınıflandırma olduğunu:
class Def { }
abstract class Animal<D extends Def> {
D def;
D getDef() { return def; }
}
class CatDef extends Def { }
class Cat extends Animal<CatDef> { }
abstract class BearDef extends Def { }
abstract class Bear<D extends BearDef> extends Animal<D> { }
class BlackBearDef extends BearDef { }
class BlackBear extends Bear<BlackBearDef> { }
class AnimalDefTest {
public static void main (String... args) {
Cat cat = new Cat();
CatDef catDef = cat.getDef(); // CatDef works fine
Bear bear = new BlackBear();
BearDef bearDef = bear.getDef(); // Error: Expected Def not BearDef? Why???
BearDef bearDef2 = ((Animal<BearDef>)bear).getDef(); // Works
}
}
Neden getDef
bir BearDef
almak için bir Bear
(Animal<BearDef>
) için döküm olmak gerektirir? Ayı, sonuç olarak extends Animal<? extends BearDef>
olarak tanımlanmıştır. Ben Ayı sınıf çizgisini değiştirirseniz
abstract class Bear<D extends BearDef> extends Animal<BearDef> { }
o hala çalışmıyor. D silin ve aşağıdaki satırı yukarıdaki kodda hata giderir (ama bana alt sınıf tanımları ile yapmanız gereken ne yardımcı olmuyor):
abstract class Bear extends Animal<BearDef> { }
+ 1: Beni ona yendi. – Powerlord
+1 benden de. –
Bu * tür bir şey anlamlıdır, ancak en azından bir BearDef olduğunu bildiğinden, ikinci satırda sahip olduğunuz şeyi esas olarak varsaymamalı mıdır? – Nicole