2015-12-03 75 views
4

我有一点问题了几次,我想要做这样的事情:你可以引用'这个'类作为一个通用参数吗?

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 
    } 
} 

,但是那是相当难看,而且很容易不小心把错误的类作为参数。

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


编辑:所提供的答案,“有没有办法来指代当前类型与类型的变量?目前并没有解决这个问题(除了斯卡拉的答案)

+0

我不确定'this.class'应该代表什么。它应该代表“类”吗?我不理解你的问题 –

+0

我的意思是它应该引用扩展MyInterface的具体类,所以在这种情况下它应该最终成为MyInstance,但是如果另一个类(比如AnotherInstance)扩展了MyInterface,getValidator() ''会返回一个如前所述的Validator FuzzyJulz

+0

,这对于链接方法也是一个问题,所以想象一下你想将StringBuilder扩展为一个新类'ErrorBuilder',并添加另一个链接方法,比如'appendError()',如果你做'新的ErrorBuilder()。appendError(“Error”)。append(“Here”)'那会工作正常,因为'appendError()'会返回一个'ErrorBuilder'类,但是如果你做了'new ErrorBuilder ).append(“Here”)。appendError(“Error”)'它会失败,因为append返回一个StringBuilder!如果你的签名像'public this.class append(String x)' – FuzzyJulz

回答

2

我不相信有什么比你的“通常”来得到你究竟是什么以后的方式。

然而,作为替代,你可以考虑考虑:

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

其中MyInterface也定义了验证所需要的存取方法。 (请注意,MyInstance的实现仍可能会返回Validator<MyInstance>。)

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

0

你想要什么是不可能的。

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

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

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

然而,在你的界面中,getValidator()返回类型为“定义”为Validator<MyInterface>(因为this.class的背景下简称MyInterface的接口)

而且您不能将Validator<MyInstance>指定为Validator<MyInterface>

原因是,如果你可以这样做,你可以有另一个类返回Validator<MyOtherInstance>,你也可以指定Validator<MyInterface>。然后,当您尝试调用Validator<MyInstance>上的方法时,您现在不会确定是否使用了MyInstanceMyOtherInstance对象。

相关问题