小编Moh*_*s A的帖子

模棱两可的行为

我当时正在教学生老式的泛型,却遇到了看不见的东西!演示时的行为!:(

我有一堂简单的课

public class ObjectUtility {

  public static void main(String[] args) {
    System.out.println(castToType(10,new HashMap<Integer,Integer>()));
  }

  private static <V,T> T castToType(V value, T type){
    return (T) value;
  }

}
Run Code Online (Sandbox Code Playgroud)

输出为10,没有任何错误!!!我原以为这会给我ClassCastException,但有些错误,例如Integer无法转换为HashMap。

好奇与愤怒,我尝试getClass()了返回值,如下所示

System.out.println(castToType(10,new HashMap<Integer,Integer>()).getClass());
Run Code Online (Sandbox Code Playgroud)

如我所料,它抛出ClassCastException。

另外,当我将同一条语句分为两部分时,类似

Object o = castToType(10,new HashMap<Integer,Integer>());
System.out.println(o.getClass());
Run Code Online (Sandbox Code Playgroud)

它不会引发任何错误并打印 class java.lang.Integer

全部执行

openjdk version "1.7.0_181"
OpenJDK Runtime Environment (Zulu 7.23.0.1-macosx) (build 1.7.0_181-b01)
OpenJDK 64-Bit Server VM (Zulu 7.23.0.1-macosx) (build 24.181-b01, mixed mode)
Run Code Online (Sandbox Code Playgroud)

有人可以为我指出正确原因的正确方向吗?

java generics casting

9
推荐指数
1
解决办法
300
查看次数

JVM 什么时候开始忽略堆栈跟踪?

我在这个话题上搜索了很多。但是没有具体的解决方案/指南。

文档中

在某些情况下,某些虚拟机可能会从堆栈跟踪中省略一个或多个堆栈帧。在极端情况下,允许没有与此 throwable 有关的堆栈跟踪信息的虚拟机从此方法返回零长度数组。

有人可以阐明这可能/将会发生的情况吗?

我知道如果一遍又一遍地产生相同的堆栈跟踪,就会发生这种情况(计数没有硬性规定,AFAIK-否则请纠正我)。但这不应该是有明确行为的吗?

此外,根据这一点,通过-XX:-OmitStackTraceInFastThrow将确保我StackTrace不会丢失。在生产机器中总是这样做不是明智的吗?

java jvm exception stack-trace

9
推荐指数
1
解决办法
2483
查看次数

Java中的功能对等

我正在阅读《有效的Java》,遇到了约书亚·布洛赫(Joshua Bloch)建议类似的情况

class MyComparator extends Comparator<String>{
    private MyComparator(){}
    private static final MyComparator INSTANCE = new MyComparator();

    public int compare(String s1,String s2){ 
        // Omitted
    }
}
Run Code Online (Sandbox Code Playgroud)

XYZComparator是无状态的,没有字段。因此,该类的所有实例在功能上都是等效的。因此,节省不必要的对象创建应该是一个单例

因此,如果它没有字段那么为它指向的任何类创建一个静态的final 总是安全的吗?从两个线程并行调用时,这不会引起多线程问题吗?或者我误解了一些基本知识。如果没有共享字段,就像每个线程都有执行的自主权吗?Objectcompare

java multithreading stateless thread-safety comparator

7
推荐指数
1
解决办法
165
查看次数

Postgres 不使用日期字段索引

我创建了类似的索引

CREATE INDEX bill_open_date_idx ON bill USING btree(date(open_date));
Run Code Online (Sandbox Code Playgroud)

和,

Column      |            Type
open_date   | timestamp without time zone
Run Code Online (Sandbox Code Playgroud)

并解释分析如下

情况1

explain analyze select * from bill where open_date >=date('2018-01-01');
Run Code Online (Sandbox Code Playgroud)
CREATE INDEX bill_open_date_idx ON bill USING btree(date(open_date));
Run Code Online (Sandbox Code Playgroud)

案例2

explain analyze select * from bill where open_date>='2018-01-01';
Run Code Online (Sandbox Code Playgroud)
Column      |            Type
open_date   | timestamp without time zone
Run Code Online (Sandbox Code Playgroud)

案例3

explain analyze select * from bill where date(open_date) >='2018-01-01';
Run Code Online (Sandbox Code Playgroud)
explain analyze select * from bill where open_date >=date('2018-01-01');
Run Code Online (Sandbox Code Playgroud)

我对为什么会发生这种情况做了足够的研究,但在任何地方都没有适当的解释。只有情况 3使用了我创建的索引,其他情况则不然。为什么会发生这种情况?

据我的理解,情况 2 …

postgresql b-tree-index

6
推荐指数
1
解决办法
3478
查看次数

在 Quartz 调度器中使用 @DisallowConcurrentExecution

如果这个问题太幼稚,我很抱歉,我希望作业被调度,以便它一个一个地执行,而不是并行执行。它只执行一次。

从文档中,@DisallowConcurrentExecution 是

  • 将 {@link Job} 类标记为不能同时执行多个实例的注释(其中实例基于 {@link JobDetail} 定义 - 换句话说,基于 {@link JobKey})。

但是当我使用相同的 JobKey 安排工作时,我得到了 Failed to schedule a job org.quartz.ObjectAlreadyExistsException

如果我生成一个不同的 JobKey,它就不会注意到,@DisallowConcurrentExecution并且该作业将并行执行(如文档中所述)。

请建议我如何实现这一点,任何指针都会真正有帮助!

PS:我不知道会安排哪些工作。所以,如果作业已经在运行,我需要一些方法来动态链接作业。

java quartz-scheduler

0
推荐指数
1
解决办法
4546
查看次数