Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使自定义元组类通用?_Java_Generics_Hashcode - Fatal编程技术网

Java 如何使自定义元组类通用?

Java 如何使自定义元组类通用?,java,generics,hashcode,Java,Generics,Hashcode,我正在尝试创建一个通用的元组类。它将其元素存储为ArrayList。当然,这个类应该重写hashcode和equals方法 如何为这个类生成hashcode方法?你看,在代码中,我遇到了麻烦 另外,对于equals方法,为什么编译器强制我使用“?”。为什么我不能用t public static class Tuple<T> { ArrayList<T> tuple = new ArrayList<>(); public Tu

我正在尝试创建一个通用的元组类。它将其元素存储为ArrayList。当然,这个类应该重写hashcode和equals方法

如何为这个类生成hashcode方法?你看,在代码中,我遇到了麻烦

另外,对于equals方法,为什么编译器强制我使用“?”。为什么我不能用t

public static class Tuple<T> { 
        ArrayList<T> tuple = new ArrayList<>();

        public Tuple(ArrayList<T> items) {
            for (T item : items) {
                tuple.add(item);
            }
        }

        @Override
        public int hashCode() {
            T sum = ???;
            for (T item : tuple) {
                sum += item.hashCode();
            }
            return sum;
        }

        @Override 
        public boolean equals(Object o) {
            if (o instanceof Tuple<?>) {
                Tuple<?> tup= (Tuple<?>) o;
                if (tup.tuple.size() != this.tuple.size()) {
                    return false;
                }
                for (int i = 0; i < this.tuple.size(); i++) {
                    if (this.tuple.get(i) != tup.tuple.get(i)) {
                        return false;
                    } 
                }
                return true;
            } else {
                return false;
            }
        }
    }
公共静态类元组{
ArrayList tuple=新的ArrayList();
公共元组(ArrayList项){
对于(T项:项){
tuple.add(item);
}
}
@凌驾
公共int hashCode(){
T和=???;
for(T项:元组){
sum+=item.hashCode();
}
回报金额;
}
@凌驾
公共布尔等于(对象o){
if(元组的o实例){
Tuple-tup=(Tuple)o;
if(tup.tuple.size()!=this.tuple.size()){
返回false;
}
for(int i=0;i
如注释中所述,我们应该将
hashCode
equals
方法委托给
ArrayList tuple
实例变量。对于
hashCode
来说,它是微不足道的。对于
equals
来说,它只是稍微复杂一点,因为我们不希望自定义的
Tuple
ArrayList
相等。这就是:

public class Tuple<T> {

     // I made this private because I'm pedantric ;)
     private final ArrayList<T> tuple = new ArrayList<>();

     // this does the same as your code, it's just easier to read
     public Tuple(ArrayList<T> items) {
         tuple.addAll(items);
     }

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

    // generated by eclipse
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Tuple other = (Tuple) obj;
        if (tuple == null) {
            if (other.tuple != null)
                return false;
        } else if (!tuple.equals(other.tuple))
            return false;
        return true;
    }
}

一般来说,我不喜欢自己编写这些方法。通常,我制作IDE来生成这些东西。我只需要在添加新字段时重新生成它。Apache和也都是不错的选择。

您有什么理由不想授权使用
ArrayList
hashCode
equals
?这会简单得多。没有理由,谢谢!“?”的原因是,您无法确定要比较的另一个元组是否具有相同的成员类型。
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((tuple == null) ? 0 : tuple.hashCode());
    return tuple.hashCode();
}