我为其他一些通用接口创建了一个工厂接口A<T>:
public interface Factory<T, X extends A<T>> {
public X create();
}
Run Code Online (Sandbox Code Playgroud)
现在我遇到的问题是我需要为每一种类型T实例化一个工厂.这变得非常不方便,特别是如果一段代码想从做一些改造A<T>到A<T2>,其中T2是一些以前未知的类型或有这么多不同的T2,我不想为每个特殊情况指定数百家工厂.
我想将类型T作为create方法的泛型参数传递.这样我得到的东西(注意,不正确的Java :-)):
public interface Factory<X extends A<?>> {
public <T> X<T> create();
}
Run Code Online (Sandbox Code Playgroud)
Factory的实现可能只需执行以下操作:
public class Factory4B implements Factory<B> {
public <T> X<T> create() {
return new B<T>();
}
}
Run Code Online (Sandbox Code Playgroud)
将以上版本的接口写下来会给出create的返回值的错误消息:
X型不是通用的; 它不能用参数参数化
有没有办法实现这样的通用工厂,还是我需要使用完全不同的方法?我希望能够在类级别指定X,这样我就可以轻松地实例化X. 我不想为每个参数T创建一个Factory
感谢您抽出时间提前回答这个问题.
根据下面的评论重新思考问题,我的问题无法实现,因为无法保证通用参数仍然存在于子类中A<T>,或者换句话说:没有泛型参数的继承.
例:
A<String>. …我正在寻找一种方法来列出正在运行的并行Java应用程序的所有同步调用,以便检测可伸缩性问题(就线程/核心而言)。据我了解,每次进入同步块时,机器都需要同步缓存。即使未通过输入同步区域来阻止正在运行的任务,这也会影响所有正在运行的CPU(以几种方式,例如内存带宽)。
我有一个大型应用程序,它在较高级别上并行化,即它具有并行执行的复杂任务。并行化的术语是,所有内核都处于负载状态,并且我没有阻塞线程。性能仍然无法随内核扩展,这可能有几个原因。我感兴趣的特定可能原因是,是否存在大量同步调用(例如,输入同步块,使用锁等)。
我想找出我的代码中(实际执行的)哪些地方进行了这样的同步调用,以及每次同步实际执行的频率。有很多引用的库,因此不可能仅对synced关键字或类似内容使用常规代码搜索,因为这将搜索很多从未执行的代码并带来很多误报。完美的解决方案是拥有一个探查器,该探查器列出所有已执行的同步位置和调用次数。但是,我尝试过的探查器仅允许对方法调用进行计数。因此,这里的问题是找到实际上相关的所有方法。
或者,如果我能找到某个入口点(主要方法)所引用的同步位置,这也将有所帮助。即,通过递归地遍历代码并检查所有引用的方法,类等进行此类同步。在这种情况下,以后可以使用常规探查器找出频率。
是否有工具或工作流,可以将上述任务归档用于较大的项目。
THX提前为您解答。