问题 如何在构建器模式中使用泛型


我试图使用泛型的构建器模式,但我不知道如何将它放在一起。我需要一些帮助和正确语法的解释。我的代码,以及我尝试过的内容。

public class LanguageMatcher<T, S> {

    // Code
    public final static class Builder<T, S> {

        // Code
    }
}

Usage (Error):

new LanguageMatcher<MyClass, YourClass>().Builder<MyClass, YourClass>()....

4592
2018-05-10 19:31


起源

试试这个: new LanguageMatcher.Builder<MyClass, YourClass>(); - hoaz
有趣的是收到这样一个问题的downvote。 - LuckyLuke
@LuckyLuke甚至对巨魔来说都不安全:/ - A4L


答案:


类型参数不会从外部类继承到静态嵌套类。所以 Builder<T, S> 实际上有一个不同 T 和 S 比 LanguageMatcher

因此,在尝试限定时,您不需要类型参数 Builder 同 LanguageMatcher。而且因为 Builder 上课是 static,你不需要一个实例 LanguageMatcher 实例化一个 Builder

LanguageMatcher.Builder<MyClass, YourClass> lm =
    new LanguageMatcher.Builder<MyClass, YourClass>();

10
2018-05-10 19:37



很好。谢谢:) - LuckyLuke
但有一件事:LanguageMatcher类是通用的,因为它实现了一个通用接口(未在前面的代码中显示)。我需要以特殊方式处理它吗?我的意思是,当我将构建器对象传递给私有构造函数时,T和S是否会在LanguageMatcher <T,S>上设置? - LuckyLuke
在私有构造函数中,您可以将参数作为参数a Builder<T, S>。这样,你就可以创建一个 LanguageMatcher<MyClass, YourClass> 用一个 Builder<MyClass, YourClass>。 Java编译器将从泛型类型参数推断泛型类型参数 Builder 目的。 - rgettman
如何了解有关泛型类型参数的推断的更多信息?我不完全理解如何以及为什么。 - LuckyLuke
有 Java Generics Tutorial的这一部分。 - rgettman