【问题标题】:Can I have a method argument typed "this class"?我可以有一个键入“这个类”的方法参数吗?
【发布时间】:2010-08-28 02:56:25
【问题描述】:

我想在接口的方法签名中有一个“这个类”类型的参数,以便任何实现它的类,例如MyClass,都会有一个带有MyClass 类型参数的方法。

public interface MyInterface {
    public thisClass myMethod(thisClass other);
    ...
}
public class MyClass implements MyInterface {
    // has to reference this class in the implementation
    public MyClass myMethod(MyClass other){
        ...
    }
}
这可能吗,还是我应该将参数与接口绑定并让每个实现检查它?

【问题讨论】:

  • 格式不错。不得不查找源代码以了解您是如何做到的。太棒了。
  • 我看不出你对什么印象深刻,但谢谢。 :)
  • 我之前认为你不能在代码块中使用斜体。您使用了 pre/code 而不是 MarkDown 缩进。也许没有什么印象深刻的,但我确实向你学习,因此我最诚挚的感谢。
  • 您应该检查 jdk 或 google 收藏库以获取您正在寻找的模式。我想你可能会追求类似 Comparable 的东西。
  • @poly:我刚刚打开 Markdown 帮助页面,阅读“缩进四个空格以创建转义的
     块”,但刚刚看到“<pre>”并使用那。 :) 然后我想用星号强调一些东西并得到更好的结果(我喜欢这种格式)!所以,这完全是我无意的,但非常欢迎你!

标签: java method-signature


【解决方案1】:
public interface MyInterface<T> {
   public T myMethod(T other);
   ...
}

public class MyClass implements MyInterface<MyClass> {
   // has to reference this class in the implementation
   public MyClass myMethod(MyClass other){
      ...
   } 
}

【讨论】:

  • 嗯。它看起来很笨重,但它正是我想要的。我可能最终会使用它,谢谢。
  • public class Foo implements MyInterface { public Bar myMethod(Bar other) { // 这不是你想要的吗? } }
  • 我将自己编写任何实现这个的类,所以我会确保我不会那样做。我并没有在寻找一种方法来强制执行此操作,只是想知道如果不检查该方法是否可行。 (虽然我猜这两种情况都归结为先决条件)
【解决方案2】:

这有点强制 T 是实现接口的类:

public interface MyInterface<T extends MyInterface<T>> {
   public T myMethod(T other);
   ...
}

【讨论】:

  • 它没有。考虑(1)抽象类 MyImpl1 实现 MyInterface { }; (2) 抽象类 MyImpl2 实现 MyInterface { }。第二个没有做高五想要的。
  • 我添加了一个“有点”限定词。我认为它尽可能接近 High Five 想要的。
  • 再一次,我会自己写这些,所以我不需要那种束缚,也不需要遇到(2)。我只是想知道如果不检查方法是否可行。
猜你喜欢
  • 2017-08-16
  • 2011-07-13
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多