Java 为什么建设者会丢失类型?

Java 为什么建设者会丢失类型?,java,generics,Java,Generics,当我尝试这样的事情时 public class Example<T> { private T value; private Example() { } public T getValue() { return value; } public void setValue(T value) { this.value = value; } public static <T>

当我尝试这样的事情时

public class Example<T> {
    private T value;

    private Example() {

    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }

    public static <T> Builder<T> builder() {
        return new Builder<>();
    }

    public static class Builder<T> {
        public Example<T> build() {
            return new Example<>();
        }
    }

    public static void main(String[] args) {
        Example<String> example = Example.builder().build();
        example.setValue("test");
        System.out.println(example.getValue().toUpperCase());
    }
}
为什么??我如何摆脱这个伪类型参数

附加问题:如何将复杂类型传递给这样的方法

public static <T> Builder<T> builder(Class<T> type) {
    return new Builder<>();
}

Example<Optional<String>> example = Example.builder(???).build();
更新:这只是一个例子。实际应用程序将有多个构建器在构建过程的不同阶段相互创建,当然,他们将有接受泛型类型的方法。我希望有一种方法可以帮助编译器推断类型。我甚至同意使用反射技巧,如果有的话,它们可以帮助我获得漂亮的DSL。

示例是一个原始类,因此隐式地T是对象。调用方法时,可以通过将泛型类型放在方法调用之前的尖括号中来指定泛型类型:

示例=Example.builder.build; //这里-------------^ 示例是一个原始类,所以隐式地T是对象。调用方法时,可以通过将泛型类型放在方法调用之前的尖括号中来指定泛型类型:

示例=Example.builder.build; //这里-------------^
编译器可以推断您试图创建的示例是一个示例,但不能推断Builder方法返回的Builder应该是一个Builder

您可以通过将语句拆分为两条语句来帮助编译器:

Builder<String> builder = Example.builder();
Example<String> example = builder.build();

编译器可以推断您试图创建的示例是一个示例,但不能推断Builder方法返回的Builder应该是一个Builder

您可以通过将语句拆分为两条语句来帮助编译器:

Builder<String> builder = Example.builder();
Example<String> example = builder.build();
如果您不介意未选中的分配警告,您可以只添加以下更改:

    public static Builder builder() {
        return new Builder<>();
    }
并将静态生成器方法更改为:

public static Builder builder() {
    return new Builder();
}
编辑结束

然后你可以这样使用它:

Example<String> example = Example.builder().build();
如果您不介意未选中的分配警告,您可以只添加以下更改:

    public static Builder builder() {
        return new Builder<>();
    }
并将静态生成器方法更改为:

public static Builder builder() {
    return new Builder();
}
编辑结束

然后你可以这样使用它:

Example<String> example = Example.builder().build();

是的,这很有效。但这太难看了:可以用另一种方式来做吗?是的,这很有效。但是它太难看了:可以用另一种方式吗?我没有流畅的界面:我没有流畅的界面:我想没有它。我明白了,但从其他评论中我得出结论,你在寻找一个语法上更漂亮的解决方案:-我想没有它。我明白了,但从其他评论中,我得出结论,您正在寻找一种语法上更漂亮的解决方案:-