这是一个奇怪的情况:我有一个这样的bean存储一些信息,我需要泛型,因为字段"数据"可以包含不同类型的数据。
public class Request<T> {
private String name;
private Integer code;
private T data;
/* Getter and setters */
}
事实是&#34;数据&#34;并不总是使用,有时它可以为null。如果我想避免原始类型,我必须定义一个类型,如下所示:
Request<Object> req = ....
有没有更好的方法,我可以两者1)避免原始类型2)在我的请求对象中有一个通用数据字段???
答案 0 :(得分:1)
也许你应该以不同的方式思考:在你的情况下,Request
并不总是有关联的数据。使用null
对值进行建模 - 值是一个错误的决定,因为每次要使用数据时都必须检查这一点。在某些时候,您希望以不同的方式处理Request
,而不是数据Request
。
也许您应该将Request
设置为包含getName()
和getCode()
等方法的界面,并创建实现此界面的两个具体类RequestWithData<T>
和RequestWithoutData
。然后,如果提供了非空数据,则可以检查是否创建了RequestWithData<T>
- 实例。此外,您可以在方法签名中表明您需要Request
包含数据或没有数据。这样可以使设计更加简洁,避免出现问题。
答案 1 :(得分:1)
如果您不介意请求类型,请在声明中使用Request<?>
。
如果请求为空(意味着没有类型,可以设置为数据),请将其声明为Request<Void>
答案 2 :(得分:1)
答案 3 :(得分:1)
也许您应该考虑更改对象层次结构。如果在某些情况下不使用数据,可能应该有两个对象:
class Request {
private String name;
private Integer code;
/* Getter and setters */
}
class DataRequest<T> extends Request {
private T data;
/* Getter and setters */
}
并使用:
Request req1 = new Request();
Request req2 = new DataRequest<String>();
答案 4 :(得分:0)
使用新的&#39;可选&#39;在Java 8中键入。它专门针对这些案例而制作。如果您因为某种原因无法使用Java 8,那么Google Guava库也会实现该类型。请查看此示例:https://gist.github.com/9833966