簡體   English   中英

Java相當於Objective-C實例類型?

[英]Java equivalent of Objective-C 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<?> )。

我不是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-copyid作為返回類型,而不是instancetype 。但通常這也沒問題,因為你通常會將返回值賦給一個類型化的引用。)

所以簡短的結論是:在Java和Objective-C中,返回類型可以由編譯器推斷,並且可以用於大多數用例。 在極少數用例中,您必須使用Java顯式轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM