Generics 在Java1.4中可以在列表中使用泛型吗?

Generics 在Java1.4中可以在列表中使用泛型吗?,generics,java,jdk1.4,Generics,Java,Jdk1.4,我必须使用Java1.4,并且使用arraylist结构。现在我需要做一些重分解,如果我能使用泛型,这将有所帮助。目前我有这样的代码 ArrayList rows = new ArrayList(); 这是一个简单的数组列表。但是现在“rows”变量变得越来越复杂,需要定义一个“Row”类。我现在想做一些类似于您在J2SE 1.5中看到的事情 ArrayList<Row> rows = new ArrayList(); ArrayList rows=new ArrayList()

我必须使用Java1.4,并且使用arraylist结构。现在我需要做一些重分解,如果我能使用泛型,这将有所帮助。目前我有这样的代码

ArrayList rows = new ArrayList();
这是一个简单的数组列表。但是现在“rows”变量变得越来越复杂,需要定义一个“Row”类。我现在想做一些类似于您在J2SE 1.5中看到的事情

ArrayList<Row> rows = new ArrayList();
ArrayList rows=new ArrayList();

如果没有第三方解决方案的复杂使用,谷歌的搜索不会暴露任何答案。在不使用第三方解决方案/开源项目的情况下(如果可能的话),我的代码将如何更改以适应1.4中的这一点

在JDK1.5中引入了泛型。所以你不能在1.4中使用它们。但是,您可以使用JDK 1.5编译器,但目标1.4与类一起使用
-target 1.4
javac选项,同时保留
-source 1.5
选项以指示源代码与1.5兼容。在这种情况下,您可以使用泛型,因为它们不应该影响结果类


你所要做的就是投下它们。如果将“错误”类型放入列表中,则可能会出现运行时异常

Row arow = (Row) rows.get(0);

for ($i=0; i<rows.size(); $i++){
    Row element = (Row) rows.get($i);
    element.printCells();
    (...)
}
Row=(行)rows.get(0);

对于($i=0;i否),您不能在JDK 1.4中使用它们。它们是在JDK1.5中引入的。泛型往往解决我在Java 1.4或更早版本中处理集合时所认为的“幼稚强制转换”问题。在Java 1.5+中,您放置的行:

ArrayList<Row> rows = new ArrayList();
泛型显然不适用于这些较旧的库-因此泛型只是一个编译时选项-1.5和1.4类实际上是等效的(减去任何内部重构/稍后添加的新方法),因为它们实际上是处理任何对象类型的ArrayList实现

1.5代码只是为您添加了一个直接强制转换

在1.4代码中,假设您想在ArrayList上迭代

for(Iterator rowIterator = rows.iterator(); rowIterator.hasNext(); ) {
    Row row = (Row) rowIterator.next();
    // Do something with the row.
}
Java 1.5的代码与naive cast版本完全相同。这需要您告诉编译器它是一行,并为您编写代码。因此,语法糖的好处更好(这对每个循环语法使用较新的语法,但它生成的代码与上面的循环相同):

因此,如果您想使用只包含行的ArrayList,您仍然可以,但是无法让编译器检查ArrayList是否只包含所有行(尽管编译器提供了此检查,但仍然可以发送包含其他类型对象的ArrayList,因为ArrayList仍然只处理对象类型,并且泛型在运行时被删除—剩下的只是您不再看到的原始强制转换代码)

非朴素的变体是检查每个实例,并自己抛出一个ClassCastException,其中包含一条信息性消息(而不是让程序抛出一条带有默认消息的消息):


然而,通常没有人这样做-好的文档可以使这个问题变得毫无意义,因为它将提供正确集合的负担放在调用方身上,因此您可以让JVM抛出ClassCastException。

是的,您可以。使用1.5编译器,并使用

javac -target jsr14 ............
这将生成Java1.4类,但允许泛型


此开关只能用于非字节码可见的1.5功能。例如,您不能使用枚举或1.5中引入的新方法。但是泛型是可以的,因为它们实际上不存在于字节码中。

对于泛型,是的,因为它们对字节码没有影响。因此可以告诉编译器使用1.5的语法,但编译器将生成与1.4兼容的类文件?我将使用的web服务器上的jvm需要1.4的运行时。尝试实现这一点的好处是防止由于强制转换问题而导致运行时错误。(必须重新添加此注释,因为它在5分钟后被锁定)很抱歉听起来像一个noob,但是我非常希望能参考一个演示Eclipse配置的链接。很抱歉,我没有经常使用Eclipse。我也没有看到任何明显的东西。要生成最终的工件,您可能应该使用一些脚本工具(ant、maven等).但是如果你在Eclipse中需要它,我建议你发布另一个问题。嘿,wtf。另一个家伙用60行告诉了你我在4中告诉你的内容。我向你推荐Joshua Bloch的“高效java”,但仅此而已。
for(Iterator rowIterator = rows.iterator(); rowIterator.hasNext(); ) {
    Row row = (Row) rowIterator.next();
    // Do something with the row.
}
for(Row row : rows) {
   // Do something with the row
}
for(Iterator rowIterator = rows.iterator(); rowIterator.hasNext(); ) {
    Object shouldBeRow = rowIterator.next();
    if(!(shouldBeRow instanceof Row)) {
        throw new ClassCastException("The object " + shouldBeRow + " is not an instance of Row - only Rows should be present in the list!");
    }
    Row row = (Row) shouldBeRow;
    // Do something with the row.
}
javac -target jsr14 ............