你能参考一下这个' class作为通用参数?

时间:2015-12-03 02:59:27

标签: 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
     }
}

但是这很难看,并且很容易意外地将错误的类作为参数。

这个还有其他解决方案吗?

修改:&#39;提供的答案是否有办法用类型变量引用当前类型?&#39;目前还没有解决这个问题(除了Scala答案)

2 个答案:

答案 0 :(得分:2)

我不相信除了你的常规&#34;之外的任何其他方式。准确地得到你所追求的东西。

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

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

其中MyInterface还定义了验证器所需的访问器方法。 (请注意,MyInstance的实施仍然可以返回Validator<MyInstance>。)

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

答案 1 :(得分:0)

你想要什么是不可能的。

原因与您无法将List<Dog>分配给List<Animal>的原因相同。

如果你想要的是什么,你可以有一个实现:

class MyInstance implements MyInterface
{
     public Validator<MyInstance> getValidator()

但是,在您的界面中,getValidator()的返回类型被“定义”为Validator<MyInterface>(因为this.class在接口的上下文中引用MyInterface < / p>

您无法将Validator<MyInstance>分配给Validator<MyInterface>

原因在于,如果你可以这样做,你可以让另一个类返回Validator<MyOtherInstance>,你也可以将其分配给Validator<MyInterface>。然后,当您尝试在Validator<MyInstance>上调用方法时,您现在不知道它是否正在使用MyInstanceMyOtherInstance个对象。