比方说,我需要为界,通用Comparable
类型的类:包封物仿制药
class A<T extends Comparable<T>> {
// this is just an example of usage of T type
List<T> comparables;
int compareSomething(T smth) {
return comparables.get(0).compareTo(smth);
}
}
类有在签名自己的泛型方法:
<V> Future<V> submit(Callable<V> task) {
return someExecutorService.submit(task);
}
现在,有限制submit
方法的输入只接受Callables
也实现T
的可能性?我第一次尝试这样的:
<V, W extends T & Callable<V>> Future<V> submit(W task) {
if(compareSomething(task) != 0)
throw new RuntimeException("");
return someExecutorService.submit(task);
}
,但发现这是不可能的(原因描述here)。有没有优雅的可能性绕过它?
编辑:一个丑陋可能性我能想到的是在两种不同类型的分裂封装,并通过在submit
对象对:
class A<T extends Comparable<T>> {
// this is just an example of usage of T type
List<T> comparables;
int compareSomething(T smth) {
return comparables.get(0).compareTo(smth);
}
<V> Future<V> submit(Callable<V> task, T comparable) {
if(compareSomething(comparable) != 0)
throw new RuntimeException("");
return someExecutorService.submit(task);
}
}
的主要缺点是,该方法签名变得比较复杂,我也需要一段后者代码有些人Callable
■一个一对一的映射T
秒。 ?也许我们可以认为,解决它以适当的方式..
编辑模式,采取两种:让我来简单解释一下我想要实现的。我正在开发一个能够执行某种特殊任务调度的自定义线程池实现。为此,该服务只接受一种特殊的Callable
任务。这些Callable
■找实现自定义界面,类似于Comparable
之一。通过比较使用此界面中的方法的任务对,该服务将:
- 如果传入任务被任何正在运行的任务阻塞,则阻止该传入任务。
- 在完成任务的
Future
完成调用尚未完成的任务。 - 通过比较他们确定的待处理任务的执行顺序。
阻挡/比较逻辑应该由任务本身来提供。这样,线程池类应该只定义池对象正在接受什么样的特殊类型,它根本不关心它们是什么类型的,它们的返回类型是什么。
编辑,采取三种:基于Erick Robertson的answer,它现在能够防止发臭任务提交:
public static void test(String[] args) {
A<Valid> scheduler = new A<>();
scheduler.betterSubmit(new Valid()); // applies to method signature
scheduler.betterSubmit(new Forbidden()); // rejected on compile time
scheduler.betterSubmit(new ConformWithValid()); // still appliable because all required interfaces implementations recognised
}
// just a bunch of test classes
private static class Valid implements Comparable<Valid>, Callable<Void> {
@Override
public int compareTo(Valid o) {
return 0;
}
@Override
public Void call() throws Exception {
return null;
}
}
private static class Forbidden implements Comparable<Forbidden>, Callable<Void> {
@Override
public int compareTo(Forbidden o) {
return -1;
}
@Override
public Void call() throws Exception {
return null;
}
}
private static class ConformWithValid implements Comparable<Valid>, Callable<Boolean> {
@Override
public int compareTo(Valid o) {
return 1;
}
@Override
public Boolean call() throws Exception {
return Boolean.FALSE;
}
}
尼斯和容易!希望有一天这能帮助和我一样的人。 :-)
密切相关:?在多重限制的类型参数为什么我不能用一个类型参数(http://stackoverflow.com/q/197190 ) – 2014-09-29 09:44:43