Java中与Objective-C的instancetype相等的类型是什么?

5

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

在Java中,instancetype的等价物是什么?


1
据我所知,Java没有任何等效的功能。 - Radiodef
2
Java的构造函数没有像Objective-C那样声明返回类型,因此在Java中不需要类似于“instancetype”的东西。 - rmaddy
3个回答

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
如果您的意思是这样的话:
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(会出现警告)。


@Abdellah 好的,如果是这样的话,相当于只需使用类名,除非我漏掉了什么? - user253751
嗯,我明白了... "除非我漏看了什么?" 这也是我的疑问。 - TooCool

0

我不是Java专家,但可能没有相应的东西,因为Java很少需要它。(Objective-C也是如此。)

请注意,在大多数情况下,您也不需要在Objective-C中使用它。这是因为编译器从接收器中推断出“真实”的返回类型,即使它声明为id。这适用于-init...+alloc...-new...

要确定方法是否具有推断相关结果类型,请考虑驼峰选择器中的第一个单词(例如,“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中显式转换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接