2016-03-05 14 views
0

我想使用Google的Guava TypeToken庫找到泛型類型。我無法找到實際的調用,使用正確的參數來提取我想要的類型。如何使用Google的Guava庫在Java中提取泛型類型

public class BaseEntity { } 
public class BaseResource { } 
public class EntityService<E extends BaseEntity, R extends BaseResource> { } 

public class TestEntity extends BaseEntity { } 
public class TestResource extends BaseResource { } 
public class TestEntityService extends EntityService<TestEntity, TestResource> { } 

public class EntityRsqlPredicateBuilder< 
    S extends EntityService<E, R>, 
    E extends BaseEntity, 
    R extends BaseResource> 
{ 
    EntityRsqlPredicateBuilder() { 
    // I would like to get the the class type for E (i.e. TestEntity.class) 
    Class<E> entityClass = ??? 
    } 
} 

// in code, use EntityRsqlPredicateBuilder 
EntityRsqlPredicateBuilder<TestEntityService> = new EntityRsqlPredicateBuilder(); 

我的備份策略只是將類傳入EntityRsqlPredicateBuilder。但是,這種類似代碼重複的情況應該已經知道。

欣賞關於如何做到這一點的任何想法。

+0

可能重複[如何確定泛型類的類?](http://stackoverflow.com/questions/182636/how-to-determine-the-class-of-a-generic-type) – MartinS

+0

是的,儘管我希望能用Guava TypeToken做出更好的答案。我認爲路易斯的答案提供了一個更簡單的解決方案,但與您提供的鏈接中列出的解決方案有相同的限制(使用匿名子類)。 –

回答

2

TypeToken無法做你想要做的事情 - 你什麼都不做。由於類型擦除,您的代碼當前寫入的方式將不可避免地丟失該信息。

TypeToken文件確實,但是,告訴你如何做一些工作這是接近你想要做什麼:

捕獲一個泛型類型(通常是匿名的)子類,並解決它針對知道類型參數是什麼的上下文類。例如:

abstract class IKnowMyType<T> { 
    TypeToken<T> type = new TypeToken<T>(getClass()) {}; 
    } 
    new IKnowMyType<String>() {}.type => String 

所以,如果你讓EntityRsqlPredicateBuilder抽象的,然後你使用new EntityRsqlPredicateBuilder<TestEntityService, TestEntity, TestResource>() {}創建它,那會工作。

+0

這是行不通的。但是,試圖決定產生的界面是否更好。一方面,用戶需要創建一個匿名子類並在寫入時指定參數,另一方面,客戶端需要在構造函數參數中傳遞類(例如,新的EntityRsqlPredicateBuilder(TestEntityService.class,TestEntity.class,TestResource)。類),假設需要知道所有三個類的類型。 –