有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java调用通用静态方法

我正在尝试创建一个通用方法来比较多种类型的对象

这是我的简单界面

interface comparable<T> {
    boolean isBiggerThan(T t1);
}

这是它的一个实现:

class StringComparable implements comparable<String> {

    public StringComparable(String s) {
        this.s = s;
    }

    String s;

    @Override
    public boolean isBiggerThan(String t1) {
        return s.equals(t1);
    }

}

这是我的类,它有一个泛型方法:

class Utilt {
    public static <T extends comparable<T>> int biggerThan(T values[], T t) {
        int count = 0;
        for (T oneValue : values) {
            if (oneValue.isBiggerThan(t)) {
                count++;
            }
        }
        return count;
    }
}

我这样称呼这个方法:

public class TestTest {
    public static void main(String args[]) {
        StringComparable a = new StringComparable("Totti");
        StringComparable pi = new StringComparable("Pirlo");
        int i = Utilt.biggerThan(new StringComparable[] { a, pi }, a);
    }
}

但我得到了这个错误:

The method `biggerThan(T[], T)` in the type `Utilt` is not applicable for the arguments `(StringComparable[], StringComparable)`

共 (3) 个答案

  1. # 1 楼答案

    请注意!comparable<String> instanceof comparable<StringComparable>。 因此,请尝试以下方法:

    class StringComparable implements comparable<StringComparable> {
    
      public StringComparable(String s) {
        this.s = s;
      }
    
      String s;
    
      public String getS(){
        return s;
      }
    
      @Override
      public boolean isBiggerThan(StringComparable t1) {
        return s.equals(t1.getS());
      }
    
    }
    

    和UTIT类

    class Utilt {
        public static <T extends comparable<T>> int biggerThan(T values[], T t) {
            int count = 0;
            for (T oneValue : values) {
                if (oneValue.isBiggerThan(t)) {
                    count++;
                }
            }
            return count;
        }
    }
    

    另外最好重写equalshashCode,这样您就可以在isBiggerThan方法中调用this.equals(t1)

    顺便说一句,方法isBiggerThan看起来非常可疑,只要:

    StringComparable s1 = new StringComparable("string1");
    StringComparable s2 = new StringComparable("string2");
    s1.isBiggerThan(s2); // output => true
    s2.isBiggerThan(s1); // output => true
    

    这取决于你,但对我来说,这个逻辑看起来是错误的

  2. # 2 楼答案

    静态方法biggerThan的泛型参数T必须实现comparable<T>StringComparable实现了comparable<String>,而不是comparable<StringComparable>,因此它与静态方法的泛型参数不匹配

    您可以通过将StringComparable更改为实现comparable<StringComparable>来解决此问题

    class StringComparable implements comparable<StringComparable> {
    
        public StringComparable(String s) {
            this.s = s;
        }
    
        String s;
    
        @Override
        public boolean isBiggerThan(StringComparable t1) {
            return s.equals(t1.s);
        }
    
    }
    

    在进行更改之后,您的main将通过编译并打印1

    也就是说,我不确定调用isBiggerThan测试相等性的方法有多大意义

  3. # 3 楼答案

    比较器接口需要的是字符串值,而不是字符串数组。当调用该方法时,您传递的是StringComparable数组,因此它会显示错误