我试图了解java重载规则.一切似乎都很好,除了以下,
public static void main(String[] args) {
long aLong = 123L;
foo(aLong);
}
private static void foo(double aDouble) {
System.out.println("Foo aDouble");
}
private static void foo(Long aWrapperLong) {
System.out.println("Foo Wrapper Long");
}
private static void foo(int anInt) {
System.out.println("Foo Int");
}
private static void foo(float aFloat) {
System.out.println("Foo Float");
}
Run Code Online (Sandbox Code Playgroud)
为什么呼叫会解决foo(float aFloat).我从JLS了解以下内容,
此步骤使用方法的名称和参数表达式的类型来定位可访问和适用的方法可能有多个此类方法,在这种情况下,选择最具体的方法.
我故意在这里使用Wrapper Long而不是原始的long.长度为64位的原始长度不会结束foo(double aDouble)但是32位浮点数foo(float aFloat).
问题为什么Java隐式(没有强制转换)将`long`转换为`float`?进一步澄清了这个问题的答案.
在设置线程池配置时,如何选择正确的RejectedExecutionHandler?
我有一个发布事件的遗留应用程序(这些事件可以在本地使用,也可以由远程进程使用)。目前,策略是中止,这会导致许多异常和错过的事件。我们将同步队列传递给线程池执行器。
我正在考虑更改RejectedExecutionHandler调用方运行策略。这可能意味着当达到线程限制和队列容量时,调用者会花时间运行该任务。我看不出有什么问题。
到目前为止,您的体验如何?另外,使用无界队列是否意味着没有效用RejectedExecutionHandler?
用户和角色之间有很多很多关系.例如
public class User {
@Id
private Integer id;
@ManyToMany
@JoinTable(name = "APP_USER_ROLE",
joinColumns = { @JoinColumn(name = "USER_ID") },
inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
private List<Role> roles = new ArrayList<Role>();
}
@Entity
public class Role {
@Id
private Integer id;
@ManyToMany(mappedBy = "roles")
private List<User> users = new ArrayList<User>();
}
Run Code Online (Sandbox Code Playgroud)
我的要求是使用他们的角色获取系统中的所有用户.使用HQL时我的查询是
select u, u.roles from User u
Run Code Online (Sandbox Code Playgroud)
但是,这会为具有相应角色的每个用户触发查询.如果有100个用户,则会触发100个查询.但是在SQL中我可以使用以下查询来实现它
select u.id,
u.name, m.roleId, r.name FROM User u left outer join UserRole m ON u.id = m.userId
inner join …Run Code Online (Sandbox Code Playgroud)