首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何反编译泛型中的桥方法?

如何反编译泛型中的桥方法?
EN

Stack Overflow用户
提问于 2019-08-06 12:08:29
回答 3查看 149关注 0票数 0

在“Java核心技术第一卷”的通用部分,作者提到了桥方法的反编译结果。然而,jad、luyten和javap的主要测试并没有得到与作者相同的结果。我想知道如何通过反编译工具来真正证明桥方法的存在。我的母语不是英语。如果描述不清楚,请原谅。相关代码和结果如下:

我尝试过javap、jad和luyten这些反编译工具。

代码语言:javascript
运行
复制
public class Pair<T> {
    private T first;

    private T second;

    public Pair() {
    }

    public Pair(T first, T second) {
        this.first = first;
        this.second = second;
    }

    public T getFirst() {
        return first;
    }

    public void setFirst(T first) {
        this.first = first;
    }

    public T getSecond() {
        return second;
    }

    public void setSecond(T second) {
        this.second = second;
    }
}
代码语言:javascript
运行
复制
import java.time.LocalDate;

public class DateInterval extends Pair<LocalDate> {
}

我想得到与原著相同的结果,我可以看到桥方法的反编译结果。decompile result by javap

EN

回答 3

Stack Overflow用户

发布于 2019-08-06 12:47:05

您需要覆盖该方法,例如:

代码语言:javascript
运行
复制
public class DateInterval extends Pair<LocalDate> {
    @Override
    public void setFirst(LocalDate first) {
        super.setFirst(first);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2019-08-06 13:58:27

桥接方法只有在需要时才会被合成。它的主要目的是保持子类的多态特性。在您的示例中,

代码语言:javascript
运行
复制
public class DateInterval extends Pair<LocalDate> {
}

尽管您正在扩展类Pair<>,但您实际上并没有重写任何行为来实现多态性。桥被创建,因此在类型擦除之后,被覆盖的签名是相同的。See here

这就是原因,当你按照shmosel的回答添加重写方法时,你会看到反编译时的桥方法。

如果你没有任何被覆盖的方法,那么就不需要桥合成了。希望这篇文章能给你一些启发。

票数 1
EN

Stack Overflow用户

发布于 2019-08-06 12:38:51

许多工具默认情况下会隐藏桥方法,因为它们很少被关注。

如果您想查看类文件中的真实内容,我建议您使用Krakatau disassembler。您还可以使用-p选项来尝试javap

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57368804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档