人们经常看到这样的建议,即变量应该用某个接口(interface)声明,而不是实现类。例如:Listlist=newArrayList();但是,假设我将此列表用于一种算法,该算法确实依赖于ArrayList的O(1)随机访问(例如Fisher-Yates改组)。在那种情况下,ArrayList对我来说代表的关键抽象是它类似数组的性质,而不仅仅是它的列表性质。换句话说,如果有人出现并将list更改为LinkedList,这将是有问题的,即使代码可以编译。在这种情况下,是否可以让声明使用实现类型?例如:ArrayListlist=newArrayList();
怎么可能没有抛出“foo”异常,但随后调用invoke()却抛出以下异常?if(method.getDeclaringClass()!=object.getClass())thrownewRuntimeException("foo");method.invoke(object);抛出的异常:java.lang.IllegalArgumentException:对象不是声明类的实例在sun.reflect.NativeMethodAccessorImpl.invoke0(native方法) 最佳答案 Beh...method.invo
eclipse编译器拒绝编译以下代码,指出字段s不可见。(IBM的AspectJ编译器也拒绝,声明“无法解析s”)这是为什么呢?publicclassTest{Strings;voidfoo(Objecto){Stringos=getClass().cast(o).s;}}Java语言规范指出:Otherwise,wesaythereisdefaultaccess,whichispermittedonlywhentheaccessoccursfromwithinthepackageinwhichthetypeisdeclared.按照我的理解,该字段是在同一个编译单元中声明和访问的,因
我有一个接口(interface)A,我必须为它提供一些不同的实现。但是,这些实现共享一些辅助方法,因此我将这些方法移到了一个抽象基类中。InterfaceA{voiddoX();}abstractClassBimplementsA{protectedvoidcommonY(){//...}@OverridepublicabstractvoiddoX();}ClassCextendsB{@OverridepublicvoiddoX(){//...}}ClassDextendsB{@OverridepublicvoiddoX(){//...}}我的代码按预期工作,但我有几个问题:我应该在
在构建新对象时,我使用了以下代码。在这段代码中,对象是否引用了变量“a”?BankAcca=newBankAcc();此外,出于兴趣,如果上面为变量a构造了一个新对象,下面的代码会做什么?它只是创建一个没有变量/对象引用的新对象吗?newBankAcc();谢谢! 最佳答案 是的,是的。当您只想使用匿名对象而不关心是否有引用时,第二个可能很有用。喜欢:newThread(newRunnable(){publicvoidrun(){}}).start(); 关于Java-对象声明和初始化,
maven-dependency-plugin通过在编译时产生警告来识别它认为是未使用的依赖项。[WARNING]Unuseddeclareddependenciesfound:[WARNING]org.foo:bar-api:jar:1.7.5:compile在某些情况下,此消息是误报,并且依赖关系是可传递的。问题:如何在我的pom.xml中识别出这种情况? 最佳答案 您应该在pom中配置ignoredDependencies元素:Listofdependenciesthatwillbeignored.Anydependencyo
我使用IntelliJUltimate来处理Java。有这么多有用的功能,但有一个可能对我来说非常好,但我找不到......有时我会在没有事先声明的情况下使用变量(第一次)。然后,我在未声明的变量上使用ctrl+Enter功能打开菜单并选择自动声明的选项。有时只是速度更快。效果很好,问题是变量会在使用的那一行自动声明。现在,我想要IntelliJ中的一个函数,它可以自动将所有声明移动到方法开头的位置。它存在吗?或者我该如何实现? 最佳答案 没有将所有声明移动到方法开始的功能(并且没有计划添加它,因为大多数编码指南建议声明变量尽可能接
我觉得我已经完成了修复此错误的正确步骤,并且我在SO和其他地方查看了与此相关的其他问题,但出于某种原因我仍然遇到问题。我正在尝试使用ApacheJMeter源代码建立一个项目。例如,文件BeanShellAssertion.java位于~/workspace/apache-jmeter-2.9/src/components/org/apache/jmeter/assertions.我的源文件夹是src/components。BeanShellAssertion.java中的包声明是packageorg.apache.jmeter.assertions;看着它,似乎一切都按照预期的方式设
我经常看到类似Listlist=newArrayList();的声明或Setset=newHashSet();对于类中的字段。对我来说,使用变量类型的接口(interface)来提供实现的灵active是非常有意义的。上面的例子仍然定义了哪种Collection必须分别使用s,分别允许哪些操作以及在某些情况下它应该如何表现(由于文档)。现在考虑实际上只有Collection的功能的情况。(甚至Iterable)接口(interface)需要使用类中的字段和Collection的种类实际上并不重要,或者我不想过度指定它。所以我选择例如HashSet作为实现并将该字段声明为Collecti
我使用Java源代码分析器分析了我正在处理的代码。其中一条警告是“始终将用户定义的异常声明为最终异常”。还有许多其他没有多大意义的警告,但这个警告让我有点困惑。我正在开发一个框架,我有一个根通用异常(比如FrameworkGenericException),对于其他异常,我只是从根异常中派生它们。所以我有一个框架的异常层次结构。我可能会扩展层次结构,但我认为这个警告告诉我不要有这样的层次结构,而是单独定义它们。那么我应该走哪条路,你有什么意见? 最佳答案 这可能是他们的标准做法:如果类不应该被继承,则将类声明为final,而且他们可