我有几次遇到过一些问题我想做这样的事情:
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答案)
答案 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>
上调用方法时,您现在不知道它是否正在使用MyInstance
或MyOtherInstance
个对象。