2012-05-15 10 views
6

:jenerik sınıfın .class niteliğini Al I (Ektorp kütüphanesinden) yapıcısı ile aşağıdaki sınıfını genişletmek çalışıyorum

public class OrderRepository extends CouchDbRepositorySupport<Order<MenuItem>> { 

    public OrderRepository(CouchDbConnector db) { 
     super(Order<MenuItem>.class, db); 

sorundur:

İşte
public class CouchDbRepositorySupport<T extends CouchDbDocument> implements GenericRepository<T> { 

... 

protected CouchDbRepositorySupport(Class<T> type, CouchDbConnector db) { 
... 

} 

benim uygulaması var Order<MenuItem>.class parçası ile. Java derleyicisi söylüyor:

Syntax error on token ">", void expected after this 

ben daha iyi şans ile (Order<MenuItem>).class, Order.class ve new Order<MenuItem>().getClass() ile çalıştı.

Genel bir sınıfın .class özniteliğini almak için ne yapabilirim?

+1

Bu haftalardan biri gibi görünüyor. –

+2

@PaulBellora Muhtemelen herhangi bir Google sorgu veya SO sorgusu, çalışma zamanında genel bir nesnenin türünü bulmakla ilgili sorular döndürdüğü için. Bu problem biraz farklı. –

cevap

1

, bunu bu şekilde elde edebilirsiniz: Daha üst sınıf bildirmek konusunda birkaç seçenek var

public class CouchDbRepositorySupport<C, T extends CouchDbRepositorySupport<C>> implements GenericRepository<T> { 
... 

    protected CouchDbRepositorySupport(Class<C> type, CouchDbConnector db) { 
     ... 
    } 

public class OrderRepository extends CouchDbRepositorySupport<MenuItem, Order<MenuItem>> { 

    public OrderRepository(CouchDbConnector db) { 
     super(MenuItem.class, db); 

; Bu sadece bir örnek.

Yasal Uyarı: Bunu bir IDE olmadan el ile yaptım, bu yüzden onunla birkaç küçük sözdizimi sorunu olabilir, ancak konsept çalışmalıdır.

2

doğru sözdizimi olacaktır:

Java'da
Order.class 

, Order<MenuItem>.class ve Order.class zamanında, genel tür bilgileri (<MenuItem> tür parametresi) nedeniyle type erasure çalışması sırasında kaybolur aynı sınıf vardır - Java'nın jenerik tip sisteminin ciddi bir sınırlaması. Eğer iç türünü yayınlamak için türünü değiştirirseniz

+0

java derleyicisi bununla aynı fikirde değildir: 'Kurucu CouchDbRepositorySupport > (Sınıf , CouchDbConnector) undefined' –

+0

Kendiniz söylediniz: _compiler_. Genel tipler derleme sırasında kontrol edilirken, "Sipariş .class" ifadesi çalışma zamanında değerlendirilir ve çalışma zamanında "" tür parametresi, sınıfın türüne göre –

+0

olduğu gibi, sınıfın tip bilgisinden _erased_ olur. Çalışma zamanı eşdeğeri olmadığı için Sipariş .class için sözdizimi değil. –

İlgili konular