在我的Java代码中,我经常使用非常方便的method(Class... args)varargs.据我所知,它们允许您传递任意数量的Class对象或数组Class[].由于我也经常使用Java集合类,因此两者之间缺乏兼容性使我感到沮丧.结果,我最终做了collection.toArray(),但这有一些类型安全问题.
所以现在问题是:为什么Java不允许实例Iterable<T>作为vararg参数,只要泛型类型适合T...vararg 的类型?不是每个人都一直使用列表,集等吗?是否有一种简单,类型安全的方式来提供从集合到vararg的转换?
以下代码:
public class TestInnerClass {
public static void main(String[] args) throws IOException {
new TestInnerClass().serializeInnerClass();
}
private void serializeInnerClass() throws IOException {
File file = new File("test");
InnerClass inner = new InnerClass();
new ObjectOutputStream(new FileOutputStream(file)).writeObject(inner);
}
private class InnerClass implements Serializable {
private static final long serialVersionUID = 1L;
}
}
Run Code Online (Sandbox Code Playgroud)
抛出以下异常:
Exception in thread "main" java.io.NotSerializableException: TestInnerClass
Run Code Online (Sandbox Code Playgroud)
我猜内部类有一个TestInnerClass.this字段允许私有访问TestInnerClass的字段和方法.声明内部类静态可以解决它,但是如果InnerClass需要这种访问呢?有没有办法在没有封闭类的情况下序列化非静态内部类,例如通过引用外部类transient?
编辑:例如,只有在序列化之前才需要访问外部类.好的,编译器无法知道,但我认为这就是transient关键字存在的原因.
以下代码给出了编译错误:
public void method(List<String> aList) {}
public void passEmptyList() {
method(Collections.emptyList());
}
Run Code Online (Sandbox Code Playgroud)
有没有办法将空列表传递给method没有
new ArrayList<String>()?
我在eclipse(A,B,C)中有3个java项目,其中C是A和B的必需项目.每次我启动eclipse时,都会出错
Project 'A' is missing required Java project: 'C'
Project 'B' is missing required Java project: 'C'
Run Code Online (Sandbox Code Playgroud)
当我从A或B的构建路径中删除项目C,并再次添加它时,错误消失.... cannot be resolved to a type只有当我从构建路径中删除项目C时才会出现错误,并且从项目A或B中F3到项目C中的源文件工作,这意味着它确实找到了正确的源文件.
我的.classpath文件如下所示:
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/JCIFS"/>
<classpathentry combineaccessrules="false" kind="src" path="/C"/>
<classpathentry kind="output" path="bin"/>
</classpath>
Run Code Online (Sandbox Code Playgroud)
我的eclipse版本是Galileo,插件:Subclipse,CDT(所以没有Maven).检查自动构建.
有人知道我每次开始日食时都能避免重新添加项目吗?
我正在构建一个需要与cd数据库交互的程序.谷歌搜索向我展示了像freedb或gnudb这样的项目,但似乎已经很久了(freedb的论坛上的最后一次活动是在2007年被垃圾邮件淹没之前).Freedb仍然有效,但没有维护,并返回凌乱的结果.有谁知道可以自由访问的活动CDDB项目?
我有一个类,可以列出一个通用Number和一个Double执行某个计算.
这很好用:
public class Test<T extends Number> {
public void testGeneric(List<T> list){
doTest(list);
}
public void testExplicit(List<Double> list){
doTest(list);
}
public void doTest(List<? extends Number> testList){}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果有问题的参数是嵌套类型,则它不再编译:
public class Test<T extends Number> {
public void testGeneric(List<List<T>> list){
doTest(list);
}
public void testExplicit(List<List<Double>> list){
doTest(list);
}
public void doTest(List<List<? extends Number>> testList){}
}
Run Code Online (Sandbox Code Playgroud)
请注意,列表的功能无关紧要,第二个List类型可以是通用的,例如T类型的包装器.我真的不明白为什么会有任何不同.有没有解决的办法?
谢谢!