2

我习惯于在类型化集合中使用泛型,但我从未真正使用它们来开发某些东西。

我有几个这样的课程:

public class LogInfoWsClient extends GenericWsClient {
    public void sendLogInfo(List<LogInfo> logInfoList) {
        WebResource ws = super.getWebResource("/services/logInfo");
        try {
            String response = ws.accept(MediaType.TEXT_HTML).type(MediaType.APPLICATION_XML).put(String.class, new GenericEntity<List<LogInfo>>(logInfoList) {
            });     
    }
}

在一个和另一个之间唯一改变的是服务字符串(“/services/info”)和列表的类型(在这种情况下是LogInfo)

我已经将几个方法重构为 GenericWsClient 类,但我的目标是拥有可以像这样使用的东西:

List<LogInfo> myList = database.getList();
SuperGenericClient<List<LogInfo>> superClient = new SuperGenericClient<List<LogInfo>>();
superClient.send(myList,"/services/logInfo");

但我不知道该怎么做,或者即使它可能。这有没有可能?

4

3 回答 3

1

是的java.util.collection,例如,如果您查看包,您可能会发现所有类都是 parameterzid。

所以你的班级将是这样的

public SuperGenericClient<E> {       
    public E getSomething() {
         return E;
    }
}

然后使用它,您将拥有

SuperGenericClient<String> myGenericClient = new SuperGenericClient<String>();
String something = myGenericClient.getSomething();

扩展您的示例本身,您的代码将如下所示:

public class SuperGenericClient<E> extends GenericWsClient {
    public void send(List<E> entityList, String service) {
        WebResource ws = super.getWebResource(service);
        try {
            String response = ws.accept(MediaType.TEXT_HTML).type(MediaType.APPLICATION_XML).put(String.class, new GenericEntity<E>(entityList) {
            });
        }            
    }
}

public class GenericEntity<E> {
    public GenericEntity(List<E> list){

    }
}

您必须阅读本文才能很好地理解泛型。

于 2012-05-15T16:02:22.910 回答
1

您可以像下面这样编写您的课程 - 您可以将相同的想法应用于GenericEntity.

public class SuperGenericClient<T> extends GenericWsClient {

    public void send(List<T> list, String service) {
        WebResource ws = super.getWebResource(service);
        try {
            String response = ws.accept(MediaType.TEXT_HTML).type(MediaType.APPLICATION_XML).put(String.class, new GenericEntity<T>(list) {
            });
        }            
    }
}

然后你可以这样称呼它:

List<LogInfo> myList = database.getList();
SuperGenericClient<LogInfo> superClient = new SuperGenericClient<LogInfo>();
superClient.send(myList,"/services/logInfo");
于 2012-05-15T16:03:06.557 回答
1

像这样声明你的类:

public class LogThing<T> {
    public void sendLogInfo(List<T> list) {
        // do thing!
    }
}

当你使用它时,这样做:

List<LogInfo> myList = db.getList();
LogThing<LogInfo> superClient = new LogThing<LogInfo>();
superClient.sendLogInfo(myList);
于 2012-05-15T16:03:58.137 回答