3

像这样的东西:

class C {

    typeof(this) foo() { return this; }

}

好吧,我知道这在 Java 6 中是不可能的,所以我很高兴听到我是否可以在 Java 7 中做到这一点。

编辑

这对于链接方法调用应该很有用,并避免创建临时局部变量,如下所示:

class Entity {

    typeof(this) refresh();

    typeof(this) clone();

    typeof(this) detach();

}

class FooEntity extends Entity {

    @Override
    typeof(this) detach() {
        fooLink21.removeRef(this); 
        bar39.detach(); 
        return this; 
    }

    void doSomeInteresting() {}
}

fooEntity.clone().detach().doSomeInteresting();

还有更多。

我认为将这个函数添加到编译器应该很容易,也许我应该破解openjdk或gcj?

顺便说一句,我从来没有成功重建过openjdk。

4

4 回答 4

5

如果您使用泛型,它可能看起来有点像这样:

class Parent<C extends Parent> {

   public C getMe (){
      return this;
   }
}

class Sub extends Parent<Sub> { }

它可能有效,但我不建议编写这样的代码。设计太差了...

于 2011-04-25T13:07:30.410 回答
2

我认为在 Java 6 或 Java 7 中没有任何方法可以做到这一点。添加它并不容易 - 我认为返回类型将是所谓的“依赖类型”,这是一个更复杂的东西类型系统比 Java 目前有。

据我所知,Gressie 关于向基类添加类型参数的答案是接近你想要的东西的唯一方法。

但是,如果您准备使用辅助函数,则可以在类上不带类型参数的情况下执行此操作:

abstract class Entity {
    public static <T extends Entity> T detach(T entity) {
        entity.detach();
        return entity;
    }
    protected abstract void detach();
}

然后你可以说:

import static Entity.detach;

detach(fooEntity).doSomeInteresting();

不过,这很笨拙。

于 2011-04-25T15:12:12.670 回答
1

我不太了解 Java(主要使用 C#/C++ 的 SD 大二学生),但您可能想看看泛型。如果它们是我认为与 C++、C# 相关的东西,它们就像模板,您可以在其中编写返回模板类型的方法。

http://en.wikipedia.org/wiki/Generics_in_Java

于 2011-04-25T12:52:05.450 回答
1

从你正在做的事情来看,为什么不使用构造函数呢?看起来您可能会问如何返回方法?如果是这样的话:

您可以在 Java 中返回一个方法。我强烈建议您不要考虑这种做法的替代方案。看看java.lang.reflect;提供对方法、字段和构造函数的访问。Java 并不是“打算”处理一流的函数。如果您决定这样做,请为大量的 catch 语句做好准备......

于 2011-04-25T13:17:49.483 回答