Java中的泛型类型推断限制
|
我在使用 Java泛型类型推断的项目中面临以下问题.这是一个类似于我原始代码的代码示例: public class BuildableObject<R,S> {
public static class OneParameter<R> { }
public static class TwoParameters<R,S> { }
interface TwoParamInterface<R,S> { }
public static class Implementer<T> implements TwoParamInterface<T,T> {}
private final OneParameter<R> first;
private final OneParameter<S> second;
private final TwoParameters<R,S> third;
private final TwoParamInterface<R,S> fourth;
private BuildableObject(OneParameter<R> first,OneParameter<S> second,TwoParameters<R,S> third,TwoParamInterface<R,S> fourth) {
this.first = first;
this.second = second;
this.third = third;
this.fourth = fourth;
}
public static class Builder<R,S> {
private OneParameter<R> first = null;
private OneParameter<S> second = null;
private TwoParameters<R,S> third = null;
private TwoParamInterface<R,S> fourth = null;
public Builder() {}
public Builder<R,S> first(OneParameter<R> first) {
this.first = first; return this;
}
public Builder<R,S> second(OneParameter<S> second) {
this.second = second; return this;
}
public Builder<R,S> third(TwoParameters<R,S> third) {
this.third = third; return this;
}
public Builder<R,S> fourth(TwoParamInterface<R,S> fourth) {
this.fourth = fourth; return this;
}
public BuildableObject<R,S> build() {
return new BuildableObject<>(first,second,third,fourth);
}
}
public static void main(String... args) {
new Builder<>()
.first(new OneParameter<>())
.second(new OneParameter<>())
.third(new TwoParameters<>())
.fourth(new Implementer<String>())
.build();
}
}
此代码在新的Implementer< String>中断,但是如果我使用new Builder< String,String>而不是新的Builder<>. 为什么Java不能推断Builder的类型是Builder< String,String>如果在新的实施者< String>中指定了R和S的类型? Java泛型类型推断的限制是什么?它只解析构造函数或静态方法中提供的类型吗?我没有找到任何关于此的文件. 如果我们不能使用类型推断,这是否意味着该类可能不是类型安全的? 解决方法它在 https://docs.oracle.com/javase/specs/jls/se9/html/jls-18.html中详细记录.但问题在于它的详细记录:除非你阅读有关这一主题的论文,否则你不太可能熟悉许多行话.对于这种情况,您只需要了解对于类型推断,在新的Builder<>()之后调用哪种方法并不重要;仅使用构造函数本身的参数(以及目标类型,例如在Builder< String,String> b = new Builder<>();,但在这种情况下,您没有).
没有.
它们完全不相关. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
