[英]Java equivalent of Objective-C 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<?>
)。
我不是Javaist,但可能沒有等價物,因為Java很少需要它。 (而Objective-C也這樣做。)
請注意,在Objective-C中,您大多數時間也不需要它。 這是因為編譯器從接收器推斷出“真實”返回類型,即使它被聲明為id
。 這適用於-init…
, +alloc…
, -new…
+alloc…
-new…
:
要確定方法是否具有推斷的相關結果類型,將考慮camel-case選擇器中的第一個單詞(例如,“initWithObjects”中的“init”),如果其返回類型兼容,則該方法將具有相關的結果類型與其類的類型和如果:
- 第一個單詞是“alloc”或“new”,方法是類方法,或
- 第一個單詞是“autorelease”,“init”,“retain”或“self”,該方法是一個實例方法。
在Java中,這也是new
運算符的推斷。 構造函數沒有任何返回類型,因此不需要推斷。
到此為止:不需要Java或Objective-C中的(顯式)關鍵字。
在某些情況下,您有其他方法返回接收器類的新實例。 克隆/復制就是這種情況。 在Java中,您必須鍵入強制轉換結果。 在Objective-C中,您可以使用instancetype
使代碼更易於閱讀。 (順便說一句: NSObject
的-copy
有id
作為返回類型,而不是instancetype
。但通常這也沒問題,因為你通常會將返回值賦給一個類型化的引用。)
所以簡短的結論是:在Java和Objective-C中,返回類型可以由編譯器推斷,並且可以用於大多數用例。 在極少數用例中,您必須使用Java顯式轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.