在Objective-C中,instancetype
可用作返回调用它们的类(或该类的子类)实例的方法的返回类型。
在Java中,instancetype
的等价物是什么?
在Objective-C中,instancetype
可用作返回调用它们的类(或该类的子类)实例的方法的返回类型。
在Java中,instancetype
的等价物是什么?
interface Base<B extends Base<B>> {
// do something and return this.
B append(String s);
}
interface SubBase<B extends SubBase<B>> extends Base<SubBase<B>> {
// append returns a SubBase<B>
}
class MyClass implements SubBase<MyClass> {
public MyClass append(String s) {
// do something
return this;
}
}
虽然不太优雅,但它能正常工作。
class Vehicle {
instancetype doNothing() {return this;}
}
class Car extends Vehicle {}
Car c = new Car().doNothing(); // no compile errors here
没有相应的等价物。
有时候使用的一种解决方法是将类型作为泛型参数传递:
class Vehicle<instancetype> {
instancetype doNothing() {return this;}
}
class Car extends Vehicle<Car> {}
Car c = new Car().doNothing(); // works
但是如果不加 Vehicle<?>
,你就无法在任何地方使用类型 Vehicle
(会出现警告)。
我不是Java专家,但可能没有相应的东西,因为Java很少需要它。(Objective-C也是如此。)
请注意,在大多数情况下,您也不需要在Objective-C中使用它。这是因为编译器从接收器中推断出“真实”的返回类型,即使它声明为id
。这适用于-init...
、+alloc...
、-new...
:
要确定方法是否具有推断相关结果类型,请考虑驼峰选择器中的第一个单词(例如,“initWithObjects”中的“init”),如果其返回类型与其类的类型兼容,并且:
- 第一个单词是“alloc”或“new”,并且该方法是类方法;或者
- 第一个单词是“autorelease”、“init”、“retain”或“self”,并且该方法是实例方法。
在Java中,这也适用于new
运算符。构造函数没有任何返回类型,因此不需要推断。
到此为止:在Java或Objective-C中不需要显式关键字。
在某些情况下,您可能会有返回接收器类的新实例的其他方法。克隆/复制就是这样一种情况。在Java中,您必须对结果进行类型转换。在Objective-C中,您可以使用instancetype
使代码更易于阅读。(顺便说一句:NSObject
的-copy
返回类型为id
,而不是instancetype
。但通常这不是问题,因为您通常将返回值分配给一个类型引用。)