我有一个String[]像这样的值:
public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
Run Code Online (Sandbox Code Playgroud)
鉴于String s,有没有一种好的方法来测试是否VALUES包含s?
两个具有相同方法名称和签名的接口.但是由单个类实现,那么编译器将如何识别哪个接口的方法是什么?
例如:
interface A{
int f();
}
interface B{
int f();
}
class Test implements A, B{
public static void main(String... args) throws Exception{
}
@Override
public int f() { // from which interface A or B
return 0;
}
}
Run Code Online (Sandbox Code Playgroud) 那么,明确实现接口的一个好用例究竟是什么?
是否仅仅是因为使用该类的人不必在intellisense中查看所有这些方法/属性?
从TreeMap的JavaDoc:
请注意,如果此有序映射要正确实现Map接口,则由有序映射维护的排序(无论是否提供显式比较器)必须与equals一致.(请参阅Comparable或Comparator以获得与equals一致的精确定义.)这是因为Map接口是根据equals操作定义的,但是map使用compareTo(或compare)方法执行所有键比较,因此有两个键从排序地图的角度来看,通过这种方法被视为相等的是相等的.即使排序与equals不一致,也可以很好地定义有序映射的行为.它只是不遵守Map接口的一般合同.
有人可以给出一个具体的例子来说明如果排序与equals不一致可能会出现的问题吗?举例来说,用户定义的类具有自然顺序,即它实现了Comparable.JDK中的所有内部类都保持这个不变量吗?
在英语中,同形异义词对是两个具有相同拼写但含义不同的单词.
在软件工程中,一对同形方法是两种具有相同名称但要求不同的方法.让我们看一个人为的例子,让问题尽可能清晰:
interface I1 {
/** return 1 */
int f()
}
interface I2 {
/** return 2*/
int f()
}
interface I12 extends I1, I2 {}
Run Code Online (Sandbox Code Playgroud)
我该如何实施I12?C#有办法做到这一点,但Java没有.所以唯一的方法是破解.怎样才能最可靠地使用反射/字节码技巧/等(也就是说它不一定是一个完美的解决方案,我只想要一个效果最好的解决方案)?
请注意,我无法合法反向工程的一些现有的闭源大量遗留代码需要一个类型参数,I12并将I12两者都委托给I1作为参数的代码和作为参数的代码I2.所以基本上我需要让它的一个实例I12知道什么时候它应该起作用I1,什么时候它应该起作用I2,我相信可以通过在直接调用者的运行时查看字节码来完成.我们可以假设调用者没有使用反射,因为这是简单的代码.问题是作者I12没想到Java会f从两个接口合并,所以现在我必须想出最好的解决问题的方法.没有什么叫I12.f(显然如果作者写了一些实际调用的代码I12.f,他会在出售之前注意到这个问题).
请注意,我实际上是在寻找这个问题的答案,而不是如何重构我无法改变的代码.我正在寻找可行的最佳启发式或者如果存在的话,可以找到精确的解决方案.请参阅Gray的答案以获得有效示例(我确信有更强大的解决方案).
这是一个具体的例子,说明两个接口内的单应方法问题是如何发生的.这是另一个具体的例子:
我有以下6个简单的类/接口.它类似于剧院周围的商业和在其中表演的艺术家.为了简单起见,我们假设它们都是由不同的人创建的.
Set 代表一组,如集合论:
interface Set {
/** Complements this set,
i.e: all elements in the set …Run Code Online (Sandbox Code Playgroud) java ×4
interface ×2
arrays ×1
c# ×1
comparable ×1
comparator ×1
comparison ×1
equals ×1
inheritance ×1
overriding ×1