[英]Passing Type Parameters using Generics in Java
我正在嘗試使泛型更有意義,並且我遇到以下情況:
// This is one of many Models I have that want to use like this, or similar
public class MyData{
private String name;
private String color;
//... default constructor
//... setters and getters
}
我有一個抽象類:
public abstract class CacheAble<T>{
// The idea is any T can be inserted
public abstract <T> boolean insertCacheAble(T data);
// The idea is any T can be deleted
public abstract <T> boolean deleteCacheAble(T data);
}
所以我想做的是以下幾點:
// Have my Operations for how i want to handle the methods on MyData
public MyDataOps extends CacheAble<MyData>{
//... Members
public MyDataOps(){
//.. initialize some other members
}
@Override
public <T> boolean insertCacheAble(T data){
//... want to be able to Access MyData.name & MyData.color
//... how can I do this?
String name = data.getName();
String color = data.getColor();
//.. insert db values
}
@Override
public <T> boolean deleteCacheAble(T data){
String name = data.getName();
String color = data.getColor();
//... Perform db delete based on name or color
}
}
如您所見,我對Java Generics不太滿意,所以任何指向正確方向的建議都會非常有幫助! 我應該將其作為通用接口實現嗎?
在你的代碼中
public abstract class CacheAble<T>{
public abstract <T> boolean insertCacheAble(T data);
public abstract <T> boolean deleteCacheAble(T data);
}
類型參數T
的方法是不一樣的T
作為類類型參數。 那可能不是您想要的。 首先,它使方法的通用性超出了您的期望(如果您固定了類的type參數,則希望固定它們的簽名)。 其次,這迫使您在子類中的那些方法的實現中使用類型參數,即使它們應在特定類型上起作用。 因此,如下定義:
public abstract class CacheAble<T>{
public abstract boolean insertCacheAble(T data);
public abstract boolean deleteCacheAble(T data);
}
同樣,如“ sodik”所指出的那樣,您的子類特定於T
的特定類型,因此不再應引用T
,而僅引用特定的MyData
類型。 然后,您可以使用MyData
的公共方法(例如,顏色和名稱的getter和setter):
public MyDataOps extends CacheAble<MyData>{
@Override
public boolean insertCacheAble(MyData data){
// ... data.getName(); ...
// ... data.getColor(); ...
}
@Override
public boolean deleteCacheAble(MyData data){
// ... data.getName(); ...
// ... data.getColor(); ...
}
}
String name = data.getName();
String color = data.getColor();
您不能直接訪問這些字段,因為它們是私有的。
@Override
public <MyData> boolean insertCacheAble(MyData data){
//... want to be able to Access MyData.name & MyData.color
//... how can I do this?
String name = data.name; // This doesn't work
String color = data.color; // This doesn't work
//.. insert db values
}
T
不是您使用名稱或顏色的私有成員實現的類。 MyData
有效。 用MyData
對象替換您的T
對象參數,一切都應該正常工作。
public class MyData{
public Hashmap<String,Object> dataField;
//... default constructor
//... setters and getters
}
...
@Override
public boolean insertCacheAble(MyData data){
String name = data.dataField.get("name");
String color = data.dataField.get("color");
//.. insert db values
}
let anObject be a <T> with field MyData myData
insertCacheAble(anObject.myData);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.