- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
(实际问题在最后)
世界你好!这里发生了一些令人不安的事情,我无法理解......
尽管我很懒,但我讨厌一遍又一遍地重新实现愚蠢的 euqals() 方法;也是 hashCode() 方法,但仍然将“相等”重点放在选定的成员变量上。我还可以通过使用检查类实例的默认接口(interface)或使用反射来减少实现,但我认为我可以使用此静态实用程序方法和 labmda:
public class StackOverflow_TestEq {
static public interface JcLambda_pG1_pG1_rBool<T> {
boolean test(T p1, T p2);
}
static public <T> boolean equals_internal(final T pThisObject, final Object pOtherObject, final JcLambda_pG1_pG1_rBool<T> pEqualizer) {
if (pThisObject == null) return pOtherObject == null;
if (pOtherObject == null) return false;
final Class<? extends Object> thisClass = pThisObject.getClass();
if (!thisClass.isInstance(pOtherObject)) return false;
@SuppressWarnings("unchecked") final T other = (T) pOtherObject;
final boolean res = pEqualizer.test(pThisObject, other);
// System.out.println("Testing " + pThisObject + " vs " + other + " => " + res);
return res;
}
/*
* TEST DEFINES
*/
static private interface CNameable {
String getName();
}
static private class CA implements CNameable {
String name = "Bier";
@Override public String toString() {
return getClass().getSimpleName() + "." + name;
}
@Override public String getName() {
return name;
}
}
static private class CB implements CNameable {
String name = "Schnaps";
@Override public String toString() {
return getClass().getSimpleName() + "." + name;
}
@Override public String getName() {
return name;
}
}
@SuppressWarnings("synthetic-access") static private class CC extends CA {
@SuppressWarnings({ "hiding" }) String name = "Wein";
@Override public String toString() {
return getClass().getSimpleName() + "." + name;
}
@Override public String getName() {
return name;
}
}
@SuppressWarnings("synthetic-access") static private class CD extends CA {
@SuppressWarnings({ "hiding" }) String name = "Bier";
@Override public String toString() {
return getClass().getSimpleName() + "." + name;
}
@Override public String getName() {
return name;
}
}
/*
* TEST
*/
@SuppressWarnings("synthetic-access") public static void main(final String[] args) {
final CA a = new CA();
final CB b = new CB();
final CC c = new CC();
final CD d = new CD();
final JcLambda_pG1_pG1_rBool<CNameable> res = new JcLambda_pG1_pG1_rBool<CNameable>() {
@Override public boolean test(final CNameable pP1, final CNameable pP2) {
// return pP1.getName().equals(pP2.getName());
return pP1.getName() == pP2.getName();
}
};
System.out.println("\nExplicit eq");
System.out.println("a=a:" + equals_internal(a, a, (p1, p2) -> p1.getName().equals(p2.getName())));
System.out.println("a=b:" + equals_internal(a, b, (p1, p2) -> p1.getName().equals(p2.getName())));
System.out.println("a=c:" + equals_internal(a, c, (p1, p2) -> p1.getName().equals(p2.getName())));
System.out.println("a=d:" + equals_internal(a, d, (p1, p2) -> p1.getName().equals(p2.getName())));
System.out.println("\nExplicit ==");
System.out.println("a=a:" + equals_internal(a, a, (p1, p2) -> p1.getName() == p2.getName()));
System.out.println("a=b:" + equals_internal(a, b, (p1, p2) -> p1.getName() == p2.getName()));
System.out.println("a=c:" + equals_internal(a, c, (p1, p2) -> p1.getName() == p2.getName()));
System.out.println("a=d:" + equals_internal(a, d, (p1, p2) -> p1.getName() == p2.getName()));
System.out.println("\nImplicit");
System.out.println("a=a:" + equals_internal(a, a, res));
System.out.println("a=b:" + equals_internal(a, b, res));
System.out.println("a=c:" + equals_internal(a, c, res));
System.out.println("a=d:" + equals_internal(a, d, res));
System.out.println("\nExplicit eqName");
System.out.println("a=a:" + equals_internal(a, a, (p1, p2) -> p1.name.equals(p2.name)));
System.out.println("a=b:" + equals_internal(a, b, (p1, p2) -> p1.name.equals(p2.name)));
System.out.println("a=c:" + equals_internal(a, c, (p1, p2) -> p1.name.equals(p2.name)));
System.out.println("a=d:" + equals_internal(a, d, (p1, p2) -> p1.name.equals(p2.name)));
System.out.println("\nExplicit ==name");
System.out.println("a=a:" + equals_internal(a, a, (p1, p2) -> p1.name == p2.name));
System.out.println("a=b:" + equals_internal(a, b, (p1, p2) -> p1.name == p2.name));
System.out.println("a=c:" + equals_internal(a, c, (p1, p2) -> p1.name == p2.name));
System.out.println("a=d:" + equals_internal(a, d, (p1, p2) -> p1.name == p2.name));
}
}
输出:
Explicit eq
a=a:true
a=b:false
a=c:false
a=d:true
Explicit ==
a=a:true
a=b:false
a=c:false
a=d:true
Implicit
a=a:true
a=b:false
a=c:false
a=d:true
Explicit eqName
a=a:true
a=b:false
a=c:true
a=d:true
Explicit ==name
a=a:true
a=b:false
a=c:true
a=d:true
所以...我期待所有 5 个变体(eq
、==
、Implicit
、eqName
, ==name
) 给我返回相同的结果 (true, false, false, true)...
但是 eqName
和 ==name
则不然。为什么它们返回 a=c
作为 true
而不是 false
?
这与那里发生的名称隐藏有关吗?因此,比较 lambda 始终访问 CA.name
,而不是访问 CC.name
?
最佳答案
来分析为什么下面的结果是true
equals_internal(a, c, (p1, p2) -> p1.name == p2.name)
你必须看equals_internal
的签名:
equals_internal(final T pThisObject, final Object pOtherObject, final JcLambda_pG1_pG1_rBool<T> pEqualizer)
所以在这种情况下,T
类型为a
,即CA
.
因此JcLambda_pG1_pG1_rBool<T>
您传递给静态方法的是 JcLambda_pG1_pG1_rBool<CA>
,这意味着 p1
和p2
类型为CA
,所以p1.name == p2.name
比较 name
基类的属性CA
,和"Bier" == "Bier"
由于字符串池,为 true。
equals_internal(a, c, (p1, p2) -> p1.name.equals(p2.name))
的结果是 true
出于同样的原因(仅在这里,您不必依赖字符串池为 String
返回相同的 "Bier"
实例,因为您正在使用 String.equals
)。
在前 3 种情况中,结果不同,因为您使用的是 getName()
方法,该方法在子类中被重写,并返回 name
子类的属性。
总而言之,不同的行为是由以下事实引起的:与方法不同,实例变量无法被覆盖。
关于Java 8、等于、== 和 Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45436127/
根据小节 11.4.8 ECMAScript 5.1 标准: The production UnaryExpression : ~ UnaryExpression is evaluated as fo
我正在尝试构建一个“新评论”功能,向用户显示自上次访问以来的新评论数量。我构建了一个“ View ”表,其中包含主题 ID、用户 ID 和时间戳。每次用户访问该主题时更新时间戳或插入新行(如果不存在)
如标题所述,为什么: > !!1=="1" 等于 True 和 > !!2=="2" 等于: False 同样,为什么 > "1"==true 等于 true 而 > "2"==true 等于 fal
我在 Stack Overflow post 上看到了下图 但是,我对“p OR q”、“p AND q”的结果感到困惑,其中“p”等于“false”,“q”等于“unknown”。 在图中,“p O
一栏有效 whereJsonContains('VehicleApplications' ,['ModelName' => $model, 'YearID' => $year] )->
如果满足条件,我如何才能只获取特定记录? 我有代码为 "SELECT a.id, a.text, a.uid, a.time FROM story a INNER JOIN friends b
我正在尝试运行 MongoDB 查询并返回字段为空的记录(更具体地说,在 pyMongo 中为 None)。所以它必须等于 null。 我知道这不等于: {"firstName": {"$ne": N
我在 Java 中进行单元测试时遇到问题。 我把我的代码和错误放在这里。在互联网上我发现这是哈希码的问题。我需要重新创建它们,但我不知道为什么以及如何。 我的方法: public void setGr
如何在 Typescript 中实现 equals? 我尝试了几种方法,都没有奏效。 选项1: abstract class GTreeObject{ abstract equals(obj:
我查看了很多地方,大多数 arraylist 示例都使用“String”作为元素,但是很难找到使用对象的地方。 假设我正在制作一个图书 Collection ,并且我有一个作者对象: class Au
$a,$b,$c = 1,2,3; print "$a, $b, $c\n"; 返回 , , 1 那么 = (equals) 是否比元组构造具有更高的优先级 - 这样做? $a,$b,($c=1
在此代码片段中,a 和 i 分别具有什么值以及为什么? int i = 1; int a = i++; 是a == 1还是a == 2? 最佳答案 a==1。然后,i==2 如果你这样做的话,那就是a
我觉得我遗漏了一些明显的东西。这是一个简单的例子来说明我的问题。 我希望 current = 3 返回“之前”。 current = 4 应该返回“key-two”,current = 5 应该返回“
有人能告诉我为什么这会返回 true 吗?我想如果我投一些东西给例如Object 然后调用.equals,将使用 Object 的默认实现。 s1 == s2 应该返回 false。 请告诉我在哪个主
我需要检查加载到 UIImage 对象文件中的文件是否等于另一个图像,如果是,则执行一些操作。不幸的是,它不起作用。 emptyImage = UIImage(named: imageName) if
我想知道什么是正确的 Java 编程范式来覆盖类 C 对象的 equals(和 hashCode)方法,在以下情况下 (a) 有没有足够的信息来确定 C 的两个实例是否相等,或者 (b) 调用方法不应
>>> (()) == () True >>> (()) () 最佳答案 () 是一个 0 元组。 (foo) 产生 foo 的值。因此,(()) 产生一个 0 元组。 来自 the tutorial
考虑这段代码: var i = 0; >> undefined i += i + i++; >> 0 i >> 0 // why not 1? 由于增量 (++) 运算符,我希望 i 为 1。我认为
在我看来,TValue 似乎缺少一个强制方法; TValue.Equals(TValue)。 那么比较 2 个 TValue 的快速且合适的方法是什么,最好不使用 TValue.ToString(),
使用 SQL 时,在 WHERE 子句中使用 = 代替 LIKE 有什么好处吗? 如果没有任何特殊的运算符,LIKE 和 = 是相同的,对吧? 最佳答案 不同的运算符 LIKE 和 = 是不同的运算符
我是一名优秀的程序员,十分优秀!