1 回答
TA贡献1825条经验 获得超4个赞
我能做到这一点的唯一两种方法是添加一个指定类型的构造函数参数:
MyClass<Float> instance = new MyClass<>(0.f).withFoo(42).withBar("helloworld");
或者通过添加“终端投射”方法:
public class MyClass<T> {
// ...
public MyClass() { ... }
public <U> MyClass<U> cast() {
MyClass<U> copy = new MyClass<>();
return copy.withFoo(foo).withBar(bar);
}
public MyClass<T> withFoo(int foo) { ... }
public MyClass<T> withBar(String bar) { ... }
}
然后你可以像这样调用它:
MyClass<Float> instance = new MyClass<>().withFoo(42).withBar("helloworld").cast();
第三种方法是提供一个MyClass<Float>专门用于创建实例的工厂方法:
static MyClass<Float> newFloatInstance() { return new MyClass<>(); }
然后你可以像这样调用它:
MyClass<Float> instance = newFloatInstance().withFoo(42).withBar("helloworld");
但我猜你可能真的不想为每种可能的类型都使用工厂方法。
但是请注意,如果您能够在不向 cast 方法(或构造函数)提供将其实例与其MyClass类型参数相关联的情况下执行此操作,那么您实际上不需要类上的类型变量。
您可以将类型变量推送到需要该类型变量的方法上:
public class MyClass {
// ...
public <T> T doSomethingToSpecificType(List<T> list, T arg) {
// do something type-specific.
}
}
添加回答
举报