Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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 如何在泛型类中返回'this'?_Java_Generics - Fatal编程技术网

Java 如何在泛型类中返回'this'?

Java 如何在泛型类中返回'this'?,java,generics,Java,Generics,例如,我有一门课: public class Test<T> { public T setField() { return this; } } 公共类测试{ 公共T设置字段(){ 归还这个; } } 当然,这是一门不正确的课。但是我可以写其他的吗?(希望它没有错误)。 另外,我知道我可以编写一个抽象方法在子类中重写它。但是我只询问泛型类(仅在its类主体中)。如果您想返回类的实例(this),它只需使用类声明(Test)即可: 公共测试设置字段()

例如,我有一门课:

public class Test<T> {
    public T setField() {
        return this;
    }
}
公共类测试{
公共T设置字段(){
归还这个;
}
}
当然,这是一门不正确的课。但是我可以写其他的吗?(希望它没有错误)。
另外,我知道我可以编写一个抽象方法在子类中重写它。但是我只询问泛型类(仅在its类主体中)。

如果您想返回类的实例(
this
),它只需使用类声明(
Test
)即可:

公共测试设置字段(){
归还这个;
}

如果要返回泛型参数的类型,请查看的答案。

仅当使用递归类型绑定时,将其转换为
T
才有意义。仍然需要添加强制转换并抑制警告:

abstract class Test<T extends Test<T>> {
     @SuppressWarnings("unchecked")
     public T setField()
     {
         return (T)this;
     }
}

这样的东西在Java中一般不可能安全地工作
仅已知为
测试
的一个实例,该实例不已知为要返回的类型
T的子类型。
T
上没有可以保证
T
的实例的绑定。无论你给
T
什么边界,对于任何你可以用于
T
的满足这些边界的类型(称之为
X
),我可以定义一个扩展
Test
的新类(与
X
无关),并且你不能将这个类的实例返回为
X
,因为它不是
X

Test
的实例怎么可能是
T
的实例呢?你到底想做什么?我想让它返回子类中的类实例。当我创建class
class-ChildTest扩展测试时
。我只需要使用builder模式并在父类中移动一些方法。可能还有其他方法。它是否返回子实例?或者泛型父类实例?抱歉,我不太了解这种机制。没有“子”或“泛型父”类。只有一个
测试
类。谷歌搜索“java泛型类型擦除”。但这是不安全的。@wero:cast是不安全的
只有在派生类的extends子句出错的情况下,此
才可能不是
T
@newacct。在我看来,这是一个可以控制的风险。@wero:我不知道你说的“搞砸了”是什么意思;程序员应该能够根据声明的边界定义类,并且应该是安全的。如果您要依赖程序员遵循一些非强制约定,那就不是类型安全。此外,您不需要边界,只需将其声明为
抽象类测试
,因为,既然您假设程序员按照自己的方式进行测试,那么它应该不会有什么区别。@wero:“递归类型边界是一种向基类的任何用户发出信号的方式,表示t预期是从基类派生的”我同意。这就是边界所说的。但是,代码中的任何内容实际上都不依赖于
T
是从基派生的这一事实。特别是,无论您是否具有该绑定,这两种方式都不能保证
T
。“关于假定的不安全强制转换,而不让您首先证明您从未编写过不安全强制转换。”编写可证明安全的未经检查强制转换是可以的。在这里,你的石膏被证明是不安全的。
abstract class Test<T extends Test<T>> {
     @SuppressWarnings("unchecked")
     public T setField()
     {
         return (T)this;
     }
}
public class DerivedTest extends Test<DerivedTest> { ... }
DerivedTest d = new DerivedTest().setField();