Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 你能参考一下';这';类作为泛型参数?_Java_Generics - Fatal编程技术网

Java 你能参考一下';这';类作为泛型参数?

Java 你能参考一下';这';类作为泛型参数?,java,generics,Java,Generics,我有几次遇到了一点问题,我想做这样的事情: interface MyInterface { public Validator<this.class> getValidator(); } class MyInstance implements MyInterface { public Validator<this.class> getValidator() { //do stuff } } interface M

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

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

class MyInstance implements MyInterface
{
     public Validator<this.class> getValidator()
     {
          //do stuff
     }
}
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{

验证器您想要的是不可能的

原因与无法将
列表
分配给
列表
的原因相同

如果您想要的是可能的,您可以有一个实现:

class MyInstance implements MyInterface
{
     public Validator<MyInstance> getValidator()
类MyInstance实现MyInterface
{
公共验证器getValidator()
但是,在您的界面中,
getValidator()
的返回类型被“定义”为
Validator
(因为
this.class
在界面上下文中引用了
MyInterface

您不能将
验证程序
分配给
验证程序


这样做的原因是,如果您可以这样做,您可以有另一个类返回一个
验证器
,您也可以将它分配给
验证器
。然后当您尝试调用
验证器
上的方法时,您现在不知道它是接受
MyInstance
还是
MyTheInstance
obj的类ects.

我不确定这个.class
应该代表什么。它应该代表
类吗?我不理解你的问题,我的意思是它应该引用扩展MyInterface的具体类,所以在这种情况下它应该是MyInstance,但是如果另一个类(比如说AnotherInstance),extended MyInterface,
getValidator()
将返回一个验证器,如前所述,这也是链式方法的一个问题,因此假设您想将StringBuilder扩展为一个新类
ErrorBuilder
,并添加另一个链式方法,比如说
appendError()
,如果您这样做了
new ErrorBuilder()。appendError(“Error”).append(“Here”)
可以正常工作,因为
appendError()
将返回一个
ErrorBuilder
类,但是如果执行了
newerrorbuilder().append(“Here”).appendError(“Error”)
它会失败,因为append返回一个StringBuilder!如果您可以有一个像
public this.class append(String x)
这样的签名,这将非常理想。答案不能解决问题,因为无法解决您的问题。您想要的是Java类型系统中的类型安全。请参阅我的答案。