给出以下示例(使用带有Hamcrest匹配器的JUnit):
Map<String, Class<? extends Serializable>> expected = null;
Map<String, Class<java.util.Date>> result = null;
assertThat(result, is(expected));
Run Code Online (Sandbox Code Playgroud)
这不能使用JUnit assertThat方法签名编译:
public static <T> void assertThat(T actual, Matcher<T> matcher)
Run Code Online (Sandbox Code Playgroud)
编译器错误消息是:
Error:Error:line (102)cannot find symbol method
assertThat(java.util.Map<java.lang.String,java.lang.Class<java.util.Date>>,
org.hamcrest.Matcher<java.util.Map<java.lang.String,java.lang.Class
<? extends java.io.Serializable>>>)
Run Code Online (Sandbox Code Playgroud)
但是,如果我将assertThat方法签名更改为:
public static <T> void assertThat(T result, Matcher<? extends T> matcher)
Run Code Online (Sandbox Code Playgroud)
然后编译工作.
所以有三个问题:
assertThat方法更改为Matcher<? extends T>?是否有任何缺点?如果你这样做,还有其他案例会破裂吗?assertThat在JUnit 中对方法进行泛化是否有任何意义?该Matcher级似乎并不需要它,因为JUnit的调用matches方法,它不与任何普通类型的,只是看起来像一个企图迫使一个类型安全这并不做任何事情,因为Matcher实际上只会不匹配,无论如何测试都会失败.不涉及不安全的操作(或似乎如此).供参考,以下是JUnit的实现assertThat:
public static <T> void assertThat(T actual, Matcher<T> matcher) {
assertThat("", …Run Code Online (Sandbox Code Playgroud) 是SecureRandom线程安全的?也就是说,在初始化之后,可以访问依赖的下一个随机数是线程安全的吗?检查源代码似乎表明它是,并且这个错误报告似乎表明它缺乏文档作为线程安全是一个javadoc问题.有人确认它实际上是线程安全的吗?
在java中,如果一个类实现Serializable但是是抽象的,它是否应该声明一个longVersionUID,或者子类只需要它?
在这种情况下,确实意图是所有子类都处理序列化,因为该类型的目的是在RMI调用中使用.
我需要一个比较器作为策略模式的一部分,可以使用对象的自然顺序或一些自定义顺序.对于自然排序的情况,我写了一个简单的比较器:
private static class NaturalComparator<T extends Comparable<? super T>> implements Comparator<T> {
@Override
public int compare(T o1, T o2) {
return o1.compareTo(o2);
}
}
Run Code Online (Sandbox Code Playgroud)
看起来很简单,但我想知道是否有人知道标准API中的一个.我查看了TreeMap,它没有这样的类,所以当编写代码时,明显的答案是否定的,但也许稍后会添加.
我想更改二进制文件的修改时间戳.这样做的最佳方式是什么?
打开和关闭文件是一个不错的选择吗?(我需要一个解决方案,在每个平台和JVM上更改时间戳的修改).
如何更改列以删除默认值?
该列创建时使用:
ALTER table sometable Add somecolumn nchar(1) NOT NULL DEFAULT 'N'
Run Code Online (Sandbox Code Playgroud)
然后改为:
alter table sometable alter column somecolumn nchar(1) null
Run Code Online (Sandbox Code Playgroud)
这允许空值,但默认值仍然存在.你怎么能删除它?
考虑以下代码:
public class Progressor
{
private IProgress<int> progress = new Progress<int>(OnProgress);
private void OnProgress(int value)
{
//whatever
}
}
Run Code Online (Sandbox Code Playgroud)
这会在编译时出现以下错误:
字段初始值设定项不能引用非静态字段,方法或属性'Progressor.OnProgress(int)'
我理解它所抱怨的限制,但我不明白为什么它是一个问题,但该字段可以在构造函数中初始化,如下所示:
public class Progressor
{
private IProgress<int> progress;
public Progressor()
{
progress = new Progress<int>(OnProgress);
}
private void OnProgress(int value)
{
//whatever
}
}
Run Code Online (Sandbox Code Playgroud)
关于字段初始化与构造函数初始化需要此限制的C#有什么区别?
对于初学者编写正则表达式来说,这似乎是一个巨大的混乱源,可能会导致隐藏的性能问题,并且看起来典型的用例将是非贪婪的.
这只是出于遗留原因(它是如何首次完成的,每个实现都复制了),还是有原因的?
当我使用编译器警告(JDK 1.5)编译我的项目时,我收到一堆错误的路径元素警告:
警告:: [path]坏路径元素"C:\ Users\User\MyJava\common\lib\junit.jar":没有这样的文件或目录警告:: [路径]坏路径元素"C:\ Users\User\MyJava\common\lib\jdom.jar":没有这样的文件或目录警告:: [path]坏路径元素"C:\ Users\User\MyJava\common\lib\xerces.jar":没有这样的文件或目录警告:: [path]坏路径元素"C:\ Users\User\MyJava\common\lib\xml-apis.jar":没有这样的文件或目录
还有很多.
这是使用IDEA 8.1.3.在IDEA的配置中找不到任何地方(我对整个项目进行了深思熟虑),其中任何内容都指向这些文件.他们在这个名字下确实不存在,但是什么引用了它们?
java ×7
c# ×1
comparable ×1
comparator ×1
file ×1
generics ×1
itext ×1
junit ×1
pdf ×1
regex ×1
regex-greedy ×1
t-sql ×1
touch ×1