【发布时间】:2016-03-07 12:59:37
【问题描述】:
有几次我遇到了一些问题,我想做这样的事情:
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的答案)
【问题讨论】:
-
我不确定
this.class应该代表什么。它应该代表Class<MyInterface>吗?我不明白你的问题 -
我的意思是它应该引用扩展 MyInterface 的具体类,所以在这种情况下它应该最终成为 MyInstance,但如果另一个类(比如 AnotherInstance)扩展 MyInterface,
getValidator()会返回一个验证器 -
如前所述,这也是链式方法的问题,因此假设您想将 StringBuilder 扩展为一个新类
ErrorBuilder,并添加另一个链式方法,假设appendError(),如果你这样做new ErrorBuilder().appendError("Error").append("Here")可以正常工作,因为appendError()将返回ErrorBuilder的类,但是如果您这样做new ErrorBuilder().append("Here").appendError("Error")它将失败,因为 append 返回一个 StringBuilder!如果您可以拥有像public this.class append(String x)这样的签名,那就太理想了 -
答案并不能解决问题,因为它无法解决您的问题。您想要的不是 Java 类型系统中的类型安全。看我的回答。