我当时正在教学生老式的泛型,却遇到了看不见的东西!演示时的行为!:(
我有一堂简单的课
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》,遇到了约书亚·布洛赫(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
我创建了类似的索引
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 …
如果这个问题太幼稚,我很抱歉,我希望作业被调度,以便它一个一个地执行,而不是并行执行。它只执行一次。
从文档中,@DisallowConcurrentExecution 是
但是当我使用相同的 JobKey 安排工作时,我得到了
Failed to schedule a job org.quartz.ObjectAlreadyExistsException
如果我生成一个不同的 JobKey,它就不会注意到,@DisallowConcurrentExecution并且该作业将并行执行(如文档中所述)。
请建议我如何实现这一点,任何指针都会真正有帮助!
PS:我不知道会安排哪些工作。所以,如果作业已经在运行,我需要一些方法来动态链接作业。
java ×4
b-tree-index ×1
casting ×1
comparator ×1
exception ×1
generics ×1
jvm ×1
postgresql ×1
stack-trace ×1
stateless ×1