小编Pau*_*aul的帖子

Java 8默认方法是否会破坏源兼容性?

通常情况下,Java源代码已向前兼容.在Java 8之前,据我所知,编译类源代码都已经与后来的JDK/JVM版本向前兼容.[更新:这是不正确的,请参阅下面的注释'en en'等.]但是,在Java 8中添加了默认方法后,似乎不再是这种情况.

例如,我一直使用的库的实现java.util.List包括一个List<V> sort().此方法返回已排序的列表内容的副本.这个库作为jar文件依赖项部署,在使用JDK 1.8构建的项目中运行良好.

但是,后来我有机会使用JDK 1.8重新编译库本身,我发现库不再编译: - List使用自己的sort()方法实现的类现在与Java 8 java.util.List.sort()默认方法冲突.Java 8 sort()默认方法对列表进行排序(返回void); 我的库的sort()方法 - 因为它返回一个新的排序列表 - 具有不兼容的签名.

所以我的基本问题是:

  • 由于默认方法,JDK 1.8是否为Java源代码引入了前向不兼容性?

也:

  • 这是第一次这种前向不相容的变化吗?
  • 在设计和实施默认方法时是否考虑或讨论过这个问题?是否记录在任何地方?
  • 对于这些好处,(不可否认的是)不便打折吗?

以下是在1.7下编译和运行并在1.8下运行的一些代码示例 - 但不在1.8下编译:

import java.util.*;

public final class Sort8 {

    public static void main(String[] args) {
        SortableList<String> l = new SortableList<String>(Arrays.asList(args));
        System.out.println("unsorted: "+l);
        SortableList<String> s = l.sort(Collections.reverseOrder());
        System.out.println("sorted  : "+s);
    }

    public static class SortableList<V> extends ArrayList<V> { …
Run Code Online (Sandbox Code Playgroud)

java forward-compatibility java-8 default-method

54
推荐指数
2
解决办法
3386
查看次数

为什么这个代码在Java 1.6中编译而在Java 1.7中编译?

以下代码在Java 1.6中编译良好,但无法在Java 1.7中编译.为什么?

代码的相关部分是对私有"数据"字段的引用.引用来自定义字段的同一类,因此看似合法.但它是通过一般类型的变量发生的.这段代码 - 一个基于内部库中的类的简化示例 - 在Java 1.6中工作,但现在不在Java 1.7中.

我不是在问这个如何解决这个问题.我已经做到了.我试图找到解释为什么这不再起作用的原因.我想到了三种可能性:

  • 根据JLS,此代码不是法律的,并且永远不应该编译(1.6编译器中存在错误,在1.7中已修复)
  • 根据JLS,此代码是LEGAL并且应该编译(1.7编译器中引入了向后兼容性错误)
  • 此代码属于JLS中的灰色区域

Foo.java:

import java.util.TreeMap;
import java.util.Map;

public abstract class Foo<V extends Foo<V>> {

    private final Map<String,Object> data = new TreeMap<String,Object>();

    protected Foo() { ; }

    // Subclasses should implement this as 'return this;'
    public abstract V getThis();

    // Subclasses should implement this as 'return new SubclassOfFoo();'
    public abstract V getEmpty();

    // ... more methods here ...

    public V copy() {
        V x …
Run Code Online (Sandbox Code Playgroud)

java generics javac java-6 java-7

16
推荐指数
1
解决办法
5079
查看次数

为什么`java.time.ZoneOffset`实例排序'向后'?

文档:

偏移量按它们在世界各地的同一时间发生的顺序进行比较.因此,+10:00的偏移量在+09:00的偏移量之前出现,依此类推,直至-18:00.

有谁知道他们这样订购的原因?这似乎是违反直觉的,因为它与偏移的数值的顺序相反.它也是在GMT/UTC + 0居中地图上从左到右阅读的顺序的反面.

(旁白:我不明白为什么引用的文件提到"下降到-18:00".-12:00或-24:00我明白了.为什么-18:00?如果打印出偏移量所有支持的java.time.ZoneId时区范围从-11:00到+12:00.)

更新:我的回答.从同一文档中的其他地方:

2008年,世界各地的时区抵消时间从-12:00延长至+14:00.为了防止该范围的任何问题被扩展,但仍然提供验证,偏移范围限制在-18:00至18:00(含).

java timezone timezone-offset

9
推荐指数
1
解决办法
72
查看次数

序列化的Java对象是否应始终由相同的字节序列表示,每次都是序列化的?

例如,如果对象实例被序列化(导致'byte [] bs1')然后再次序列化(导致'byte [] bs2'),'bs1'和'bs2'应该是相同的长度并包含相同的字节?如果没有,为什么不呢?

为了避免歧义,我应该说同一个对象的两个序列化(不是两个'相同的'对象 - 相同的实例),在相同的线程中,在同一个JVM上发生的相互之间的毫秒之内 - 一个(可变的) )对象被传递给一个方法,一个之后.

请注意,该对象甚至没有被序列化,序列化,然后重新序列化 - 它只是被序列化两次.而且,对象的类没有任何"聪明"的东西; 它只是一个简单的聚合POJO.

我正在使用序列化字节作为临时测试来检测对象是否已在方法内更改.但是,我似乎在看到对象显然没有改变其状态的示例 - 但是一个字节[]与另一个不同.

我假设 - 这只是一个假设 - 他们会是一样的.有什么理由可能不是吗?

附录:

此外,没有示例代码的道歉,以说明这一点.目前,这是嵌入在大型系统中的一小段代码.如有必要,我会尝试提取一个较小的,可运行的演示.我想知道我的假设是否存在基本问题,因此如果有人能够解释为什么这个假设是错误的.

java serialization

8
推荐指数
1
解决办法
328
查看次数

XML/Java:在解析标签和属性时精确的线条和字符位置?

我正在尝试找到一种方法来在解析XML文档时精确确定标记和属性的行号和字符位置.我想这样做,以便我可以准确地向文档无效的XML文档的作者(通过Web界面)报告.

最后,我想将插入符号设置为无效标记或仅在无效属性的开放引用内.(我现在不使用XML Schema,因为属性的确切格式是以一种单独的模式无法验证的方式.我甚至可能希望报告某些属性在属性的值中部分无效.或者类似,在开始和结束标记之间的文本部分.)

我尝试过使用SAX(org.xml.sax)和Locator接口.这可以达到一定程度,但还不够好.它只会事件发生报告读取位置; 例如,对于startElement(),紧接在open标记结束之后的字符.我不能只减去标签名称的长度,因为open标签中的属性,自动关闭标签和/或换行符会将其丢弃.(并且Locator根本不提供有关属性位置的信息.)

理想情况下,我希望使用基于事件的方法,因为我已经有一个SAX处理程序,它正在构建一个内部类似DOM的表示或进一步处理.但是,我有兴趣了解任何DOM或类似DOM的库,其中包含模型元素的精确位置信息.

有没有人用所需的精确度解决了这个问题,或者任何类似问题?

java xml parsing sax tokenize

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

为什么 - 在Java 1.8中 - 使用函数<V,R>而不是函数<R,V>?

顺序似乎很奇怪,因为在常规Java中,始终首先指定返回类型.如:

public static double sum(Iterable<Number> nums) { ... }
Run Code Online (Sandbox Code Playgroud)

那么为什么在Function和BiFunction类中可以选择以相反的方式指定它们呢?如:

interface Function<T,R>
interface BiFunction<T,U,R>
Run Code Online (Sandbox Code Playgroud)

我不是在这里询问关于哪个更好的意见,但具体来说:

a)优先考虑一个订单而不是另一个订单是否有任何技术或其他(非风格)好处?或者它是一个随意的选择?

b)是否有人知道任何文件说明或权威来源的任何陈述的理由,为什么选择了另一个?

旁白:如果延伸到更高的城市,这个命令似乎更奇怪.例如,一个假设的QuadFunction:

interface QuadFunction<A,B,C,D,R> { ... }
Run Code Online (Sandbox Code Playgroud)

(在撰写本文时,图书馆中的最高权力是2 - 即BiFunction.)

请参阅:http://download.java.net/jdk8/docs/api/java/util/function/package-summary.html

java generics functional-programming java-8

6
推荐指数
2
解决办法
1032
查看次数

使用POI读取.xlsx文件时出现错误"Zip文件已关闭"

public Sheet readExcel() throws Exception{
    //File fi=new File(new File(System.getProperty("user.dir"))+"\\src\\testdata2.xls");
    File fi=new File("C:\\Users\\admin\\workspace\\HMS\\src\\testdata\\testdata1.xlsx");

    Workbook wb = new XSSFWorkbook(fi);
    Sheet  Sheet = wb.getSheetAt(0);

    int rowCount = Sheet.getLastRowNum()-Sheet.getFirstRowNum();

    for (int i = 1; i < rowCount+1; i++) {
        Row row = Sheet.getRow(i);

        if(row.getCell(0).toString().length()==0){

            System.out.println(row.getCell(1).toString()+"----"+ row.getCell(2).toString()+"----"+

            row.getCell(3).toString()+"----"+ row.getCell(4).toString());
        }
    }    
    return Sheet;   
}
Run Code Online (Sandbox Code Playgroud)

通过运行上面的代码我得到这样的错误........

线程"main"中的异常java.lang.IllegalStateException:Zip文件在org.apache.poi.openxml4j.opc.ZipPackage的org.apache.poi.openxml4j.util.ZipFileZipEntrySource.getEntries(ZipFileZipEntrySource.java:45)处关闭. orP.apache.poi.opei.open上的org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:684)中的getPartsImpl(ZipPackage.java:186)(OPCPackage.java:254)在Org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:201)org.apache.poi.xssf.usermodel.XSSFWorkbook.(XSSFWorkbook.java:294)at ExcelReader.readExcel(ExcelReader.java: 16)在ExcelReader.main(ExcelReader.java:30)

任何人都可以帮我找出究竟是什么问题.

我用Google搜索但无法获得解决方案!

java excel zip apache-poi

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

为什么 Clojure 缺少用户定义的阅读器宏?

据我了解,Clojure 不会公开阅读器宏表或允许用户定义阅读器宏。

来自http://clojure.org/reader

The read table is currently not accessible to user programs.
Run Code Online (Sandbox Code Playgroud)

我只是想知道是否有明确或明确的声明(大概来自 Rich Hickey)说明将它们排除在 Clojure 之外的理由。

注意我不是问 Clojure 缺少用户定义的阅读器宏是好事还是坏事。只是想知道为什么。

language-design clojure reader-macro

6
推荐指数
1
解决办法
890
查看次数

Java 8的循环依赖性分析 - 用于自动构建

我将开发一个项目,该项目使用JDepend自动生成循环包依赖关系的报告,作为CI构建的一部分.(我主要对包级依赖性感兴趣,所以我一直在使用XSLT的减少版本来获得更有针对性的报告 - 否则,它是vanilla JDepend.)

但是我们即将把项目移到Java 8,我发现JDepend对使用JDK 1.8编译器编译的代码不起作用.JDepend似乎不再正在积极更新.

我正试图找到一个替代品:

  • 适用于JDK 1.8编译的类和/或jar.
  • 报告包和/或jar级别的循环依赖性.
  • 可以从Ant自动化(命令行可执行文件可以).
  • 生成可以从项目主页链接并在浏览器中打开的报告(例如HTML或纯文本输出 - 而不是桌面应用程序).
  • 此外(最好)生成 - 或者可以配置/调整生成 - 只关注循环依赖的重点报告(如果你修改XSLT,可以像JDepend一样).

jdepend java-8 cyclic-dependency

5
推荐指数
1
解决办法
935
查看次数

特殊的Groovy魔法重新属性访问和集合/迭代?

我理解*.Groovy中的spread运算符(2.4.3)中发生了什么:

[].class.methods*.name
=> [add, add, remove, remove, get, ...
Run Code Online (Sandbox Code Playgroud)

但是为什么离开*出去产生相同的结果呢?

[].class.methods.name
=> [add, add, remove, remove, get, ...
Run Code Online (Sandbox Code Playgroud)

我原以为要解释为访问返回的name属性,因此是一个错误.但似乎有效.然后进行了更多的实验,以下内容如下:java.lang.reflect.Method[]methods

[*[].class.methods].name
=> [add, add, remove, remove, get, ...
([].class.methods.toList()).name
=> [add, add, remove, remove, get, ...
Run Code Online (Sandbox Code Playgroud)

因此,似乎试图访问数组或列表的属性(甚至可能Iterable)实际上返回列表的每个元素的该属性的列表(如扩展运算符所示).

所以这让我想知道:

  1. 这种行为记录在哪里吗?(我在这里看不到它的例子:http://www.groovy-lang.org/operators.html并且在文档的其他地方没有看到它.)

  2. 此行为是否仅适用于"属性"(即遵循getFoo()命名约定的非arg方法)?这似乎是一些快速GroovyConsole测试的情况.

  3. 因此,当getFoo()使用参数调用非样式方法或方法时,扩展运算符是否仅是必需/有用的?(因为你可以使用.否则.)

更新:

似乎传播*.适用于任何情况,Iterable.唯一适用于集合.例如:

class Foo implements Iterable {
    public Iterator iterator() { [Long.class, String.class].iterator() } …
Run Code Online (Sandbox Code Playgroud)

groovy

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