在Objective-C中,instancetype
可以用作返回它们被调用的类的实例(或该类的子类)的方法的返回类型。
Java中instancetype
的等价物是什么?
答案 0 :(得分:4)
最接近的是使用泛型
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;
}
}
它不是那么优雅,但它有效。
答案 1 :(得分:0)
如果你的意思是这样的话:
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<?>
)。
答案 2 :(得分:0)
我没有Javaist,但可能没有相应的东西,因为Java很少需要它。 (而且Objective-C也这样做。)
请注意,在Objective-C中,您大多数时间也不需要它。这是因为编译器推断了&#34; real&#34;从接收者返回类型,即使它被声明为id
。这适用于-init…
,+alloc…
,-new…
:
要确定方法是否具有推断的相关结果类型,将考虑camel-case选择器中的第一个单词(例如,“initWithObjects”中的“init”),如果返回该方法,则该方法将具有相关的结果类型type与其类的类型兼容,如果:
- 第一个单词是“alloc”或“new”,方法是类方法,或
- 第一个单词是“autorelease”,“init”,“retain”或“self”,方法是实例方法。
在Java中,这也是new
运算符的推断。构造函数没有任何返回类型,因此不需要推断。
到此处:Java或Objective-C中不需要(显式)关键字。
在某些情况下,您有其他方法返回receiver类的新实例。克隆/复制就是这种情况。在Java中,您必须键入强制转换结果。在Objective-C中,您可以使用instancetype
使代码更易于阅读。 (顺便说一句:NSObject
&#39; s -copy
有id
作为返回类型,而不是instancetype
。但通常这也没问题,因为您通常会指定返回值到打字参考。)
所以简短的结论:在Java和Objective-C中,对于大多数用例,返回类型可以由编译器推断。在极少数用例中,您必须使用Java显式转换。