gpt4 book ai didi

java - Java中有没有一种方法可以为对象的接口(interface)表示调用不同的hashCode()

转载 作者:行者123 更新时间:2023-11-29 10:15:45 24 4
gpt4 key购买 nike

我一直在处理一个域问题,我有一些类实现了一个公共(public)接口(interface),我希望能够从这些对象中获取不同的哈希值,具体取决于对象是作为接口(interface)访问还是作为具体类实例访问.基本上我想要的是以下内容:

public class A implements Bar{
@Override
public int hashCode(){ return 1;}

@Override
public int Bar.hashCode(){ return 123;}
}
public class B implements Bar{
@Override
public int hashCode(){ return 1;}

@Override
public int Bar.hashCode(){ return 123;}
}
public class C implements Bar{
@Override
public int hashCode(){ return 1;}

@Override
public int Bar.hashCode(){ return 123;}
}

Bar interfaceObject = new A();
interfaceObject.hashCode(); //return 123

Bar aObject = new A();
aObject.hashCode();// return 1

据我所知,没有办法做到这一点,我能想到很多这可能导致问题的原因,但我想问问那些比我聪明的人,他们是否有什么好的方法来做到这一点除了使界面具有类似 public int getCustomHashCodeForJustThisInterface() 的功能之外。我喜欢能够在 hashMaps 中使用这些对象而不必跳过箍,但是他们当前的 hashCode 实现会中断,因为这些对象可以有多个身份 View ,具体取决于它们的使用方式,而我不想要更改其 hashCode 的基本实现;

最佳答案

你不能那样做,因为 Java 不支持非多态的 instance 方法(静态方法不是多态的,如前一个答案所示)。你可以做的是让你的类直接实现Bar,而是另一个接口(interface)(例如BarProvider)与toBar() getBar() 方法,它返回类型为 Bar 的自定义对象,其行为如您所愿。

public class A implements BarProvider{
@Override
public int hashCode(){ return 1;}

@Override
public Bar toBar() {
return new Bar() {
@Override
public int hashCode() { return 123; }
};
}
}

A aObject = new A();
interfaceObject.hashCode(); //return 1;
Bar interfaceObject = aObject.toBar();
interfaceObject.hashCode(); // return 123

一些改进是可能的,例如将 Bar 对象存储为 final 字段(以避免多次初始化),并具有允许您从 Bar 返回的反向引用 到它的 BarProvider


另一种可能性是使用外部提供程序来进行计算

public class A implements Bar{
@Override
public int hashCode(){ return 1;}
}

public final class BarHasher implements Hasher<Bar> }
@Override
public int hashFor(Bar object) { return 123; }
}

A aObject = new A();
interfaceObject.hashCode(); //return 1;
BarHasher.hashFor(aObject); // return 123

或者调用其他方法的静态方法

public class A implements Bar{
@Override
public int hashCode(){ return 1;}

@Override
public int hashAsBar() { return 123; }
}

public interface BarHasher implements Hasher<Bar> {
@Override
public int hashFor(Bar object) { return object.hashAsBar(); }
}

A aObject = new A();
interfaceObject.hashCode(); //return 1;
BarHasher.hashFor(aObject); // return 123

如果您不知道,您尝试做的事情在 C++ 中是可能的(这是默认行为)(您必须将方法声明为 virtual 以具有与Java) 和 C#(但你会收到警告,除非你在覆盖方法上使用修饰符 new)

关于java - Java中有没有一种方法可以为对象的接口(interface)表示调用不同的hashCode(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18473769/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com