小编tb1*_*189的帖子

为什么Java varargs不支持集合?

在我的Java代码中,我经常使用非常方便的method(Class... args)varargs.据我所知,它们允许您传递任意数量的Class对象或数组Class[].由于我也经常使用Java集合类,因此两者之间缺乏兼容性使我感到沮丧.结果,我最终做了collection.toArray(),但这有一些类型安全问题.

所以现在问题是:为什么Java不允许实例Iterable<T>作为vararg参数,只要泛型类型适合T...vararg 的类型?不是每个人都一直使用列表,集等吗?是否有一种简单,类型安全的方式来提供从集合到vararg的转换?

java collections language-features variadic-functions

41
推荐指数
1
解决办法
1万
查看次数

为什么可序列化的内部类不可序列化?

以下代码:

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关键字存在的原因.

java serialization inner-classes

21
推荐指数
1
解决办法
3万
查看次数

是否有一种类型安全的方法将空列表作为参数传递给java?

以下代码给出了编译错误:

public void method(List<String> aList) {}

public void passEmptyList() {
    method(Collections.emptyList());
}
Run Code Online (Sandbox Code Playgroud)

有没有办法将空列表传递给method没有

  • 使用中间变量
  • 铸件
  • 创建另一个列表对象,如 new ArrayList<String>()

java generics list

18
推荐指数
2
解决办法
3480
查看次数

Eclipse缺少已导入的必需项目

我在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).检查自动构建.

有人知道我每次开始日食时都能避免重新添加项目吗?

java eclipse ubuntu

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

还有免费的CDDB数据库吗?

我正在构建一个需要与cd数据库交互的程序.谷歌搜索向我展示了像freedb或gnudb这样的项目,但似乎已经很久了(freedb的论坛上的最后一次活动是在2007年被垃圾邮件淹没之前).Freedb仍然有效,但没有维护,并返回凌乱的结果.有谁知道可以自由访问的活动CDDB项目?

api audio mp3

4
推荐指数
1
解决办法
6347
查看次数

在Java中使用嵌套泛型的通配符

我有一个类,可以列出一个通用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类型的包装器.我真的不明白为什么会有任何不同.有没有解决的办法?

谢谢!

java generics

2
推荐指数
1
解决办法
47
查看次数