Java无法正确解编译

时间:2016-06-07 16:58:42

标签: java android functional-programming java-7 jitpack

我正在使用jitpack.io

为Android开发并使用git从git编译

我试图从git中使用这个库进行函数式编程:

fj - functional programmming for Java 7

我运行代码并且即使所有内容都经过测试也会出错。

问题在于GroupBy类:

源代码:

?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>SOME_REQUEST_ID</RequestId></Error>

反编译代码:

public Collection<Group<S,T>> execute(Collection<T> collection){
    Hashtable<S, Group<S, T>> groups = new Hashtable<S, Group<S, T>>();

    for (T item: collection){
        S classification = grouper.select(item);

        if (!groups.contains(classification)){
            groups.put(classification, new Group<S, T>(classification));
        }
        groups.get(classification).add(item);
    }

    return groups.values();
}

我将不胜感激任何帮助。

目前我没有看到代码看起来不同的任何原因

由于

1 个答案:

答案 0 :(得分:1)

简短的回答是,当java被编译时,信息会丢失。但是,反编译代码的功能与您编写的代码完全相同。

让我们逐行看看......

public Collection<GroupBy.Group<S, T>> execute(Collection<T> collection) {

这是相同的,虽然它给了Group类全名。

    Hashtable groups = new Hashtable();
    Object item;
    Object classification;

正如您在此处所见,变量名称和所有通用信息都将丢失。 java中的泛型可以被认为是提示编译器来检查错误。一旦编译器完成编译,信息就会被抛弃(通常)。

    for(
        Iterator var3 = collection.iterator(); 
        var3.hasNext();                         
        ((GroupBy.Group)groups.get(classification)).add(item)
    ) {

增强的for循环已被经典for循环取代。这是因为在字节码中它们是相同的东西(尽管更聪明的反编译器可能已经解决了这个问题并在此处编写了增强的for循环)。

另一个有趣的事情是编译器已将groups.get(...).add(...)语句放在for循环中。如果您考虑for(initialisation; termination; increment)的合同,那么increment会在每次循环迭代时发生。所以即使你在循环中写了你的语句,它也是一样的效果。 [这可能是这样做的一个很好的理由,但我不是编译大师,所以我无法肯定地说。)

        item = var3.next();
        classification = this.grouper.select(item);
        if(!groups.contains(classification)) {
            groups.put(classification, new GroupBy.Group(classification));
        }
    }

    return groups.values();
}

其余的代码几乎就是你写的。