我正在研究一个(Java 8+)类,我想使用一种“构建器”模式构建它,在该模式中,您将无参数构造函数链接到一个或多个返回相同对象的设置器。基本上这是我的课:
public class MyClass {
private int foo;
private String bar;
public MyClass() {
System.out.println("initializing instance of MyClass");
}
public MyClass withFoo(int foo) {
this.foo=foo;
return this;
}
public MyClass withBar(String bar) {
this.bar = bar;
return this;
}
}
您初始化它的典型方法是
MyClass anInstance = new Myclass().withFoo(42).withBar("helloworld");
这是一个很好的模式,但我以前从未将它用于泛型类。现在我想泛化我的班级。我对类签名和构造函数、withFoo 和 withBar 方法进行了更改:
public class MyClass<T> {
private int foo;
private String bar;
public MyClass() {
System.out.println("initializing instance of MyClass");
}
public MyClass<T> withFoo(int foo) {
this.foo=foo;
return this;
}
public MyClass<T> withBar(String bar) {
this.bar = bar;
return this;
}
}
请注意,foo
它们bar
自己不会改变类型。任何类型<T>
都不会通过方法传入withVar()
。
我有一些线索表明这不是最好的方法。标准的无参数构造函数似乎工作正常:
工作正常: MyClass<Float> myInstance = new MyClass<>();
但是,如果我添加一个withVar
函数,我会在编译时遇到错误(java:不兼容的类型:MyClass 无法转换为 MyClass)。
不会编译: MyClass<Float> myInstance = new MyClass<>().withFoo(42);
我可以通过两次指定类型来使其工作,如下所示:
工作正常: MyClass<Float> myInstance = new MyClass<Float>().withFoo(42);
有没有更好的方法来编写代码,以便将泛型类型正确地传递到赋值运算符的右侧?
凤凰求蛊
相关分类