来自Effective Java Item 26 偏好通用类型
在所有其他条件相同的情况下,将未经检查的强制转换抑制为数组类型而不是标量类型风险更大,这表明第二种解决方案.但是在一个比Stack更实际的泛型类中,你可能会在代码中的许多点读取数组,因此选择第二个解决方案需要多次转换为E而不是单个转换为E [],这就是为什么第一种溶液更常用[Naftalin07,6.7].
作者scalar type在这里是什么意思,他想在这里传达什么?什么是选项1被认为比选项2更危险?
代码 :
// The elements array will contain only E instances from push(E).
// This is sufficient to ensure type safety, but the runtime
// type of the array won't be E[]; it will always be Object[]!
@SuppressWarnings("unchecked")
public Stack() {
elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY];
}
Run Code Online (Sandbox Code Playgroud)
VS
// Appropriate suppression of unchecked warning
public E pop() {
if (size == 0)
throw new EmptyStackException();
// push requires elements …Run Code Online (Sandbox Code Playgroud) 从文档中addEventListener我看到以下模式:
target.addEventListener(type, listener[, useCapture]);
Run Code Online (Sandbox Code Playgroud)
现在我明白这useCapture是一个可选参数.为什么[然后在逗号(,)之前启动,而不是在参数后面的逗号后面listener?[]除了useCapture可选的事实之外,实际建议的封闭对是什么?我还在jQuery文档中看到了类似的文档模式,例如on ()方法文档.
.on( events [, selector ] [, data ], handler(eventObject) )
Run Code Online (Sandbox Code Playgroud) 在Emacs中我可以通过使用M-f和前进和后退一个词M-b但是如果我必须向前或向前三个单词,我需要重复前面的三次,这似乎是不优雅的.在Vim中Emacs相当于单词运动概念是什么?例如,在Vim中2w,2b当我处于命令模式时,我可以通过发出和向后发送两个单词.
来自java.sql.Timestamp类的JavaDoc(强调我的)
由于Timestamp类和上面提到的java.util.Date类之间存在差异,因此建议代码不要将Timestamp值一般视为java.util.Date的实例.Timestamp和java.util.Date之间的继承关系实际上表示实现继承,而不是类型继承.
说实现继承而不是类型继承是什么意思?这是HAS-A与IS-A的案例吗?
我正在阅读"算法导论",第三版.在" 分析算法 " 部分下面写着:
我们还假设对每个数据字的大小进行限制.例如,当使用大小为n的输入时,我们通常假设整数由c lg n位表示,对于某些常数c> = 1.我们要求c> = 1,以便每个单词可以保存n的值,使我们能够索引单个输入元素,并且我们将c限制为常量,以便单词大小不会任意增长.
这里"单词"这个词有什么意义?这是用"单词"表示数据的标准吗?
请考虑以下代码:
public void broadcast(FacesEvent event)
throws AbortProcessingException {
if(!(event instanceof WrapperEvent)) {
super.broadcast(event);
return;
}
// Sets up the correct context and fire our wrapped event.
GridWrapperEvent revent = (GridWrapperEvent)event; // FindBugs is complaining here
int oldRowIndex = getRowIndex();
int oldColumnIndex = getColumnIndex();
boolean oldClientIdRewritting = clientIdRewritting;
setClientIdRewritting(revent.isClientIdRewritting());
setActiveCell(revent.getRowIndex(), revent.getColumnIndex());
FacesEvent rowEvent = revent.getFacesEvent();
rowEvent.getComponent().broadcast(rowEvent);
setActiveCell(oldRowIndex, oldColumnIndex);
setClientIdRewritting(oldClientIdRewritting);
}
Run Code Online (Sandbox Code Playgroud)
FindBugs抱怨注释行.我能做些什么吗?这就是FindBugs所说的:
未选中/未确认的 强制转换此未强制转换,并非所有类型的实例都可以强制转换为其强制类型.确保您的程序逻辑确保此强制转换不会失败.
根据Josh Bloch在Java中的说法:
除非您愿意放弃面向对象抽象的好处,否则无法扩展可实例化的类并在保留equals合同的同时添加值组件.
因此,这里是我的情况下,我有一类Foo是已经覆盖equals()并hashcode()通过IntelliJ IDEA的实现.现在我有另一个类FooChild扩展Foo并为'Foo`增加了几个字段.现在FindBugs抱怨FooChild:
类不会覆盖超类中的equals此类扩展一个定义equals方法并添加字段的类,但不定义equals方法本身.因此,此类的实例上的相等性将忽略子类的标识和添加的字段.确保这是预期的,并且您不需要覆盖equals方法.即使您不需要重写equals方法,也可以考虑覆盖它,以便记录子类的equals方法只返回调用super.equals(o)的结果这一事实.
我的问题是" 这个类的实例上的相等是什么意思会忽略子类的身份?我理解忽略添加字段的部分,因为还没有equals()为它们编写方法.
我读到Java是按值传递的.所以我们假设我们有这个代码,并说它的HashMap somehashMap寿命比foo.所以foo不允许被垃圾收集,即使它已经完成它的工作只是因为我们把foo放在Map中然后忘了从它中删除.现在按照我链接到的帖子中的答案的逻辑我们实际上是将方法的引用副本传递foo给方法put()吗?在这种情况下,foo放入HashMap应该不会阻止它被垃圾收集.你能帮我理解这里发生了什么吗?我到底错过了什么?
public void someMethod(){
Foo foo = new Foo();
somehashMap.put(fooKey,foo);
}
Run Code Online (Sandbox Code Playgroud) 我查看了这个问题,以了解为什么在包括Java在内的大多数语言中都没有算术左移运算符.但是接下来我们如何处理负整数,因为左移会将它抛弃.例如-2 ^ 5,其结果应为负数.
关于单元测试私有方法和字段,我一直在讨论这个问题,这个答案说它可以通过反射机制来完成.但是有一种说法是在混淆的情况下它会失败.为什么会这样?