小编Til*_*fer的帖子

Java:带有类泛型的方法类型参数的工厂

初步情况:

我为其他一些通用接口创建了一个工厂接口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

感谢您抽出时间提前回答这个问题.

根据以下评论重新思考问题(27.4.15)

根据下面的评论重新思考问题,我的问题无法实现,因为无法保证通用参数仍然存在于子类中A<T>,或者换句话说:没有泛型参数的继承.

例:

  • 让我们想一下派生自的C类A<String>. …

java generics factory

5
推荐指数
1
解决办法
780
查看次数

Java:计数/分析同步调用

我正在寻找一种方法来列出正在运行的并行Java应用程序的所有同步调用,以便检测可伸缩性问题(就线程/核心而言)。据我了解,每次进入同步块时,机器都需要同步缓存。即使未通过输入同步区域来阻止正在运行的任务,这也会影响所有正在运行的CPU(以几种方式,例如内存带宽)。

那个设定:

我有一个大型应用程序,它在较高级别上并行化,即它具有并行执行的复杂任务。并行化的术语是,所有内核都处于负载状态,并且我没有阻塞线程。性能仍然无法随内核扩展,这可能有几个原因。我感兴趣的特定可能原因是,是否存在大量同步调用(例如,输入同步块,使用锁等)。

任务

我想找出我的代码中(实际执行的)哪些地方进行了这样的同步调用,以及每次同步实际执行的频率。有很多引用的库,因此不可能仅对synced关键字或类似内容使用常规代码搜索,因为这将搜索很多从未执行的代码并带来很多误报。完美的解决方案是拥有一个探查器,该探查器列出所有已执行的同步位置和调用次数。但是,我尝试过的探查器仅允许对方法调用进行计数。因此,这里的问题是找到实际上相关的所有方法。

或者,如果我能找到某个入口点(主要方法)所引用的同步位置,这也将有所帮助。即,通过递归地遍历代码并检查所有引用的方法,类等进行此类同步。在这种情况下,以后可以使用常规探查器找出频率。

问题

是否有工具或工作流,可以将上述任务归档用于较大的项目。

THX提前为您解答。

java performance multithreading profiling synchronization

5
推荐指数
1
解决办法
659
查看次数