在Objective-C中,instancetype
可用作返回它們被調用的類的實例(或該類的子類)的方法的返回類型。Objective-C實例類型的Java等價物?
Java中的instancetype
的等效什麼?
在Objective-C中,instancetype
可用作返回它們被調用的類的實例(或該類的子類)的方法的返回類型。Objective-C實例類型的Java等價物?
Java中的instancetype
的等效什麼?
如果你的意思是這樣的:
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<?>
)。
的最接近的就是使用泛型
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;
}
}
這不是那麼優雅,但它的工作原理。
我不是Javaist,但可能沒有等價物,因爲Java只需要它很少。 (並且Objective-C也這樣做。)
請注意,在Objective-C中,大多數時間也不需要它。這是因爲編譯器推斷來自接收器的「真實」返回類型,即使它被聲明爲id
。這適用於-init…
,+alloc…
,-new…
:
要確定方法是否具有推斷相關結果類型,在駱駝情況下選擇器的第一個字(例如,在「initWithObjects」,「初始化」)被認爲是,如果其返回類型與其類的類型兼容,並且該方法將具有相關的結果類型:
- 第一個詞是「alloc」或「new」,並且該方法是類方法,或
- 第一個單詞是「autorelease」,「init」,「retain」或「s精靈「,該方法是一種實例方法。
在Java中可以推斷爲new
操作了。構造函數沒有任何返回類型,所以不需要推斷。
到目前爲止:在Java或Objective-C中不需要(顯式)關鍵字。
在某些情況下,您有其他方法返回接收器類的新實例。克隆/複製就是這種情況。在Java中你必須輸入結果。在Objective-C中,您可以使用instancetype
來使代碼更易於閱讀。 (順便說一句:NSObject
的-copy
具有id
作爲返回類型,而不是instancetype
但同樣一般,這是沒有問題的,因爲你通常的返回值賦給一個類型引用。)
所以短期的結論:在Java和Objective-C的返回類型可以由編譯器爲大多數用例推斷。在極少數情況下,您必須明確地使用Java進行投射。
據我所知,Java沒有任何等效的功能。 – Radiodef
Java構造函數沒有類似於Objective-C的聲明返回類型,所以在Java中不需要任何類似'instancetype'的東西。 – rmaddy