通用类型参数哪个具体扩展类?

Mar*_*ouf 5 java generics design-patterns

我想要一个实现接口的类,该接口指定特定的子类作为参数。

public abstract Task implements TaskStatus<Task> {
  TaskStatus<T> listener;

  protected complete() {
      // ugly, unsafe cast
      callback.complete((T) this);
  }
}

public interface TaskStatus<T> {
   public void complete(T task);
}
Run Code Online (Sandbox Code Playgroud)

但我想保证使用的 type-arg 不仅仅是任务或 ,而是扩展该类的特定类的类型参数。

所以我想出的最好的办法是:

public abstract Task<T extends Task> implements TaskStatus<T> {
}
Run Code Online (Sandbox Code Playgroud)

你可以通过写来扩展它:

public class MyTask extends Task<MyTask> {
}
Run Code Online (Sandbox Code Playgroud)

但这也是有效的:

public class MyTask extends Task<SomeOtherTask> {
}
Run Code Online (Sandbox Code Playgroud)

并且回调的调用将会因ClassCastException而爆炸。那么,这种方法是错误的并且被破坏了,还是有一种正确的方法可以做到这一点,我不知何故错过了?

Bru*_*ine 4

目前尚不清楚您想在其中做什么TaskTask<T>但是,如果您按如下方式定义泛型类:

class Task<T extends Task<T>> { ... }
Run Code Online (Sandbox Code Playgroud)

以下两种是可能的:

class MyTask extends Task<MyTask> { ... }
class YourTask extends Task<MyTask> { ... }
Run Code Online (Sandbox Code Playgroud)

但禁止以下行为:

class MyTask extends Task<String> { ... }
Run Code Online (Sandbox Code Playgroud)

上面的定义Task使用了 F-bounded 多态性,这是一个相当高级的特性。您可以查看研究论文“面向对象编程的 F-bounded 多态性”以获取更多信息。