出自《java puzzle》
在5.0版中,Java平台引入了大量的可以使操作数组变得更加容易的工具。下面这个谜题使用了变量参数、自动包装、静态导入(请查看http://java.sun.com/j2se/5.0/docs/guide/language [Java-5.0])以及便捷方法Arrays.toString(请查看谜题60)。那么,这个程序会打印什么呢?
import static java.util.Arrays.toString;
class ImportDuty {
public static void main(String[ ] args) {
printArgs(1, 2, 3, 4, 5);
}
static void printArgs(Object... args) {
System.out.println(toString(args));
}
}
你可能会期望该程序打印[1,2,3,4,5],实际上它确实会这么做,只要它能编译。令人沮丧的是,看起来编译器找不到恰当的toString方法:
ImportDuty.java:9:Object.toString()can't be applied to(Object[])
System.out.println(toString(args));
^
是不是编译器的理解力太差了?为什么它会尝试着去应用Object.toString()呢?它与调用参数列表并不匹配,而Arrays.toString(Object[ ])却可以完全匹配。
编译器在选择在运行期将被调用的方法时,所作的第一件事就是在肯定能找到该方法的范围内挑选[JLS 15.12.1]。编译器将在包含了具有恰当名字的方法的最小闭合范围内进行挑选,在我们的程序中,这个范围就是ImportDuty类,它包含了从Object继承而来的toString方法。在这个范围中没有任何可以应用于toString(args)调用的方法,因此编译器必须拒绝该程序。
换句话说,我们想要的toString方法没有在调用点所处的范围内。导入的toString方法被ImportDuty从Object那里继承而来的具有相同名字的方法所遮蔽(shade)了[JLS 6.3.1]。遮蔽与遮掩(谜题68)非常相像,二者的关键区别是一个声明只能遮蔽类型相同的另一个声明:一个类型声明可以遮蔽另一个类型声明,一个变量声明可以遮蔽另一个变量声明,一个方法声明可以遮蔽另一个方法声明。与其形成对照的是,变量声明可以遮掩类型和包声明,而类型声明也可以遮掩包声明。
当一个声明遮蔽了另一个声明时,简单名将引用到遮蔽声明中的实体。在本例中,toString引用的是从Object继承而来的toString方法。简单地说,本身就属于某个范围的成员在该范围内与静态导入相比具有优先权。这导致的后果之一就是与Object的方法具有相同名字的静态方法不能通过静态导入工具而得到使用。
既然你不能对Arrays.toString使用静态导入,那么你就应该用一个普通的导入声明来代替。下面就是Arrays.toString应该被正确使用的方式:
import java.util.Arrays;
class ImportDuty {
static void printArgs(Object... args) {
System.out.println(Arrays.toString(args));
}
}
如果你特别强烈地想避免显式地限定Arrays.toString调用,那么你可以编写你自己的私有静态转发方法:
private static String toString(Object[] a) {
return Arrays.toString(a);
}
静态导入工具所专门针对的情况是:程序中会重复地使用另一个类的静态元素,而每一次用到的时候都进行限定又会使程序变得乱成一锅粥。在这类情况中,静态导入工具可以显著地提高可读性。这比通过实现接口来继承其常量要安全得多,而实现接口这种做法是你从来都不应该采用的 [EJ Item 17]。然而,滥用静态导入工具也会损害可读性,因为这会使得静态成员的类在何处被使用显得非常不清晰。应该有节制地使用静态导入,只有在非常需要的情况下才应该使用它们。
对API设计者来说,要意识到当某个方法的名字已经出现在某个作用域内时,静态导入工具并不能被有效地作用于该方法上。这意味着静态导入不能用于那些与通用接口中的方法共享方法名的静态方法,而且也从来不能用于那些与Object中的方法共享方法名的静态方法。再次说明一下,本谜题所要说明的仍然是你在覆写之外的情况中使用名字重用通常都会产生混乱。我们通过重载、隐藏和遮掩看清楚了这一点,现在我们又通过遮蔽看到了同样的问题。
分享到:
相关推荐
进口税是适用于所有进口货物的附加销售税,税率为5%,不免税。 当我购买商品时,我收到一张收据,上面列出了所有商品的名称和它们的价格(包括税),包括商品的总成本和支付的销售税总额。销售税的四舍五入规则是...
在IT行业中,尤其是在财务软件开发领域,理解和处理销售税与进口税是非常关键的。C#是一种广泛用于构建企业级应用的编程语言,特别是在涉及到税收计算和管理时,C#的强大功能得以体现。以下是对"销售和进口税"这一...
本次化工新材料行业周报由华创证券发布,涵盖了新材料行业的多项重要信息和市场分析,包括新型显示新材料的进口税政策、芯片供应紧张状况、各类材料的市场动态以及投资建议等方面。 首先,报告提到了新型显示新材料...
报告中提到“新型显示新材料免征进口税”,这意味着政府可能为了鼓励创新和技术进步,减轻了相关企业的税收负担,促进国内新型显示材料的研发和产业化进程。这一政策变化可能会吸引更多的投资进入该领域,加速国产化...
【Impostometro:进口税计算器 (BR)】是一款基于Swift开发的应用程序,专为巴西市场设计,旨在帮助用户计算进口商品到巴西时所需缴纳的税费。在国际贸易中,进口税是一个重要的环节,它涉及到国家的关税政策和贸易...
7. 产业专家观点:产业专家认为,印度加征PCB进口税可能会推动国内对本土PCB制造商的投资,促进电子元件的国产化,但这同时也要求印度本地企业提高生产效率和产品质量,以满足国内及国际市场需求。 8. 特别附加税...
Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。对于初入职场的Java开发者来说,掌握好基础知识并能应对面试中的常见问题至关重要。以下是一些基于"java基本面试题"的详细知识点解析: ...
2010-2017年分省收入法地区生产总值各构成项目面板...、固定资产消耗、生产税和进口税净额、营业盈余(混合收入)相加。计算公式为:国内生 产总值=雇员报酬+固定资产消耗+生产税和进口税净额+营业盈余(混合收入)。”
2. **保税制度**:保税制度允许外国商品在特定区域内(如保税区、仓库或工厂)免缴进口税存储、加工或转口。如果商品进入国内市场,必须缴纳进口税。保税区旨在提供便利的物流服务,促进转口贸易,并让企业有机会...
2. 保税制度:保税制度允许外国商品在特定区域内(如保税区、保税仓库或保税工厂)暂时免税存储、加工或处理,无需立即支付进口税。当这些商品进入国内市场时,才需要按照进口商品缴纳关税。保税制度的目的是促进...
进口税和出口税是最基本的分类,其中进口税可能包含正税和附加税(如反倾销税、反补贴税等)。关税的征收标准有从量税、从价税、复合税和滑准税等,每种都有其特定的适用情况和目的。 资源税是对开采和利用自然资源...
关税有多种分类,如按征税对象分为进口税和出口税,按征税标准分为从量税、从价税、复合税和滑准税等。关税税率的设定考虑了国际贸易关系、市场保护等多种因素,如最惠国税率、优惠税率、差别税率等。滑准税是一种...
这些商品可以在保税区内进行仓储、加工等操作,如果最终销往国内市场,则需补缴相应的进口税。保税制度为进口商提供了灵活的操作空间,有助于促进转口贸易的发展,并为企业提供了更多商业机会。 #### 布鲁塞尔估价...
2. **保税制度(Bonded System)**:保税制度允许外国商品在特定的保税区域(如保税区、保税仓库或保税工厂)内暂时存放而不立即缴纳进口税。在这些区域内,商品可以进行存储、加工、改装等活动。只有当商品离开保税...
关税是对进出关境货物和物品征收的商品税,分为进口税、出口税,并根据不同的标准进行分类。进口税包括正税和附加税,如反倾销税、反补贴税等。关税类型有从量税、从价税、复合税和滑准税,分别适用于不同情况。关税...
关税分为正税和附加税,正税主要包括进口税、出口税和过境税,而附加税则包括反倾销税、反补贴税、报复关税和紧急关税。 进口税通常分为最惠国税和普通税,最惠国税通常是根据国际条约给予特定国家的优惠税率,而...
税务代理将帮助企业处理进口税、出口退税等涉外税务事务,确保合规且最大化税收利益。 6. **税务争议解决**:在遇到税务争议时,税务代理可以代表企业与税务机关沟通,提供法律支持,帮助解决争议,减少对企业运营...
进口税是基于发票价值计算的,海关有权评估公平市场价值并决定是否加征赋税。大部分制成品的关税率在5%-17%之间。对于享受普惠制(GSP)待遇的国家,如中国,其商品大多享有免税待遇或有配额限制。同时,英国已经...
按征税对象,关税分为进口税和出口税;按征税标准,可以分为从量税、从价税、复合税和滑准税;按征税性质,关税有普通税率、优惠税率(包括特惠税、普惠制和最惠国待遇)以及差别税率(如反倾销税、反补贴税、报复...
- **进项税额抵扣**:允许抵扣的进项税额包括购货发票上的税额、进口税凭证上的税额、废旧物资收购的10%、农产品13%、运输费用的7%等。 - **不得抵扣的进项税**:用于非应税项目、免税项目、集体福利或个人消费的...