我想要的是以下内容:
在大多数情况下,泛型类将类似于TestBuilder<X, X>
,这意味着T和O是同一类型。因此,我创建了两个不同的构造函数。我想拨打新的匿名电话,例如new TestBuilder<>(...)
(我在<>
这里叫匿名)。
存在以下4个构造函数示例:
1)工作构造函数调用
// Anonoumous, working
new TestBuilder<>(String.class, Integer.class)
.withOnNext(new Action1<Integer>()
{
@Override
public void call(Integer integer)
{
}
});
// not anonoumous, classified, working
new TestBuilder<String, String>(String.class)
.withOnNext(new Action1<String>()
{
@Override
public void call(String string)
{
}
});
2)有问题或无法正常进行的构造函数调用
// Anonoumous and working
// PROBLEM: withOnNext is called with Object instead of String
new TestBuilder<>(String.class)
.withOnNext(new Action1<Object>()
{
@Override
public void call(Object o)
{
}
});
// Anonoumous and NOT working
// this is what I want to work!
new TestBuilder<>(String.class)
.withOnNext(new Action1<String>()
{
@Override
public void call(String string)
{
}
});
问题
有没有办法让第4个构造函数起作用?如果只用一个参数调用构造函数,我不想被迫给它两个类,在这种情况下,第二个泛型类应该从第一个泛化到“继承”……而不必写,new TestBuilder<String, String>(String.class)
我想写new TestBuilder<>(String.class)
或至少new TestBuilder<String>(String.class)
...
班级
这是测试构建器类的外观:
public class TestBuilder<T, O>
{
public TestBuilder(Class<T> eventClass)
{
this(eventClass, (Class<O>)eventClass);
}
private TestBuilder(Class<T> eventClass, Class<O> observableClass)
{
init();
}
public TestBuilder<T, O> withOnNext(Action1<O> actionNext)
{
mActionNext = actionNext;
return this;
}
}
我认为Java不能在没有某种暗示的情况下推断出第二种泛型类型。一种方法是在变量声明中提供类型:
TestBuilder<String, String> testBuilder = new TestBuilder<>(String.class);
testBuilder.withOnNext(new Action1<String>() {
@Override
public void call(String string) {
//...
}
});
但是您仍然需要声明两个通用参数。
我要做的是在静态工厂方法中将两者T
和O
相同的信息封装起来:
public class TestBuilder<T, O> {
public static <T> TestBuilder<T, T> create(Class<T> eventClass) {
return new TestBuilder<T, T>(eventClass);
}
// ...
}
然后这样称呼它:
TestBuilder.create(String.class).withOnNext(...);
另一个选择是将信息封装在继承自的单独的类中TestBuilder
:
public class SimpleTestBuilder<T> extends TestBuilder<T,T> {
public SimpleTestBuilder(Class<T> eventClass) {
super(eventClass, eventClass);
}
}
public class TestBuilder<T, O> {
private TestBuilder(Class<T> eventClass, Class<O> observableClass) {
}
// ...
}
用作
new SimpleTestBuilder<>(String.class).withOnNext(...);
另一个不错的选择是封装信息O
,就像T
在静态方法中一样:
public class TestBuilder<T, O> {
public static <T> TestBuilder<T, T> create(Class<T> eventClass) {
return new TestBuilder<T, T>(eventClass);
}
// ...
}
用作
TestBuilder.create(String.class).withOnNext(...);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句