В моем проекте я сталкиваюсь со следующей проблемой, связанной с выводом типа универсальных элементов 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();
}
}
Этот код ломается на new Implementer<String>
, но работает, если я использую new Builder<String, String>
вместо new Builder<>
.
ПочемуJava не может сделать вывод, что тип Builder равен Builder<String, String>
, если типы R и S указаны в new Implementer<String>
?
Каковы пределы вывода универсальных типов Java?Разрешает ли он только типы, предоставленные в конструкторах или статических методах?Я не нашел никакой документации по этому вопросу.
Означает ли это каким-либо образом, что этот класс может быть небезопасным, если мы не можем использовать вывод типов?