java - 你能引用 'this' 类作为通用参数吗?

标签 java generics

<分区>

有几次我想做这样的事情时遇到了一些问题:

interface MyInterface
{
    public Validator<this.class> getValidator();
}

class MyInstance implements MyInterface
{
     public Validator<this.class> getValidator()
     {
          //do stuff
     }
}

因此,为了能够将对具体类的引用作为泛型参数传递,当您拥有作用于当前类的类时,通常需要这样做。一个简单的解决方案是使用 ?类型,但是当您随后需要访问类本身的值时(例如,如果您需要执行类似 getValidator().validateForm().getField() 的操作)或者即使您想要使用链式方法(如 StringBuilder.append())子类化一个类

我通常不得不这样做的方式:

interface MyInterface<T>
{
    public Validator<T> getValidator();
}

class MyInstance implements MyInterface<MyInstance>
{
     public Validator<MyInstance> getValidator()
     {
          //do stuff
     }
}

但是这样很丑陋,而且很容易不小心将错误的类作为参数。

还有其他解决方案吗?


编辑:“有没有办法用类型变量引用当前类型?”提供的答案目前没有解决这个问题(除了 Scala 的回答)

最佳答案

我认为除了您的“常规”方法之外,没有任何其他方法可以准确地获得您想要的东西。

但是,作为替代方案,您可以考虑:

interface MyInterface {
    Validator<? extends MyInterface> getValidator();
}

哪里MyInterface还定义了 validator 所需的访问器方法。 (请注意 MyInstance 的实现仍可能返回 Validator<MyInstance> 。)

visitor pattern可能是另一种改变设计以解决此问题的方法。

关于java - 你能引用 'this' 类作为通用参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34057092/

相关文章:

java - 为什么 Java 不能推断带有泛型类型参数的 lambda 表达式的类型?

java - 如何实现动态细节带高度(取决于文本长度)?

java - Google App 引擎 - 了解实例如何启动以及需要什么内存 (Java)

java - 警告 : Failed to load the sqljdbc_auth. dll 导致 : no sqljdbc_auth in java. library.path

java - 为什么其中一种方法适用于设置日期,而另一种方法则不行?

Java 7 泛型类型推断失败

java - 如何在java中处理通用列表List<MyClass>以特定方式获取结果集

java - 使用 java 连接到 Tor - TorLib

java - 转换为 T 会引发未经检查的 lint

c# - `where T : Delegate` 还是 `where T : MulticastDelegate` ?