Java相当于Objective-C实例类型?

时间:2015-05-06 21:57:49

标签: java objective-c types

在Objective-C中,instancetype可以用作返回它们被调用的类的实例(或该类的子类)的方法的返回类型。

Java中instancetype的等价物是什么?

3 个答案:

答案 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 -copyid作为返回类型,而不是instancetype。但通常这也没问题,因为您通常会指定返回值到打字参考。)

所以简短的结论:在Java和Objective-C中,对于大多数用例,返回类型可以由编译器推断。在极少数用例中,您必须使用Java显式转换。