簡體   English   中英

在Java中使用泛型傳遞類型參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM