2015-05-06 21 views
4

在Objective-C中,instancetype可用作返回它們被調用的類的實例(或該類的子類)的方法的返回類型。Objective-C實例類型的Java等價物?

Java中的instancetype的等效什麼?

+1

據我所知,Java沒有任何等效的功能。 – Radiodef

+2

Java構造函數沒有類似於Objective-C的聲明返回類型,所以在Java中不需要任何類似'instancetype'的東西。 – rmaddy

回答

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<?>)。

+0

請檢查我的編輯 – Abdellah

+0

@Abdellah在這種情況下,相當於只使用類名,除非我錯過了什麼? – immibis

+0

嗯,我明白了......「除非我失去了一些東西? 「這也是我的疑問 – Abdellah

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; 
    } 
} 

這不是那麼優雅,但它的工作原理。

0

我不是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進行投射。