【问题标题】:Generics type : not applicable for the arguments泛型类型:不适用于参数
【发布时间】:2018-04-20 14:22:29
【问题描述】:

我在编码时收到此错误。谁能向我解释为什么它不适用以及如何解决它。提前非常感谢!

错误:SearchTools12 类型中的方法 linSearch(T[], T) 不是 适用于参数 (int[], int)

import java.util.NoSuchElementException;
public class SearchTools12 {
public static int[] createSequence(int n){
    int[] a= new int[n];
    for (int i=0; i<a.length; i++){
        a[i]=i+1;
    }
    return a;
}
public static <T> int linSearch (T[] a, T x){ 
    int i = 0; 
    while (i < a.length){
        if (x == a[i]) return i;
        i += 1;
    } 
    throw new NoSuchElementException();
}

public static void main(String[] args){
    int n=30;
    int x=15;
    System.out.println(linSearch(createSequence(n), x));

}
}

【问题讨论】:

  • 我没有 JDK 来进行测试,但我认为调用您的方法的正确语法是 linSearch(createSequence(n), x)。您的方法被声明为泛型,您必须在调用它时精确关联类型
  • 警告:x == a[i] 对于大多数不是枚举类型的类型将失败。在 Java 中,== 比较引用,这意味着只有当操作数是完全相同的对象时,它才会评估为真,而不是检查等价。
  • 顺便说一句,linSearch 没有理由是通用的——public static int linSearch (Object[] a, Object x) 的声明将接受完全相同的可能参数,并以相同的方式工作

标签: java generics


【解决方案1】:

原因是int 是一个原始类型,它在java 中具有特定的作用,所以你不能将int[] 转换为T[]。您可以使用Integer[] 而不是使用原始类型,它应该可以正常工作。所以你应该把你的createSequence 方法改成

public static Integer[] createSequence(int n) {
    Integer[] a = new Integer[n];
    for (int i = 0; i < a.length; i++) {
        a[i] = i + 1;
    }
    return a;
}

【讨论】:

  • 同意。而且通常 B 型容器对 B 型的可铸造性较差(或根本不能)
【解决方案2】:

linSearch (T[] a, T x) 需要 T 的数组,但您试图传递 int 的数组。并且数组int[]的类型与数组T[]的类型不同。

要做到这一点,可以尝试改变:

linSearch (T x, T... a) // vararg of generic T

然后调用:

linSearch(x, createSequence(n))  // passing int[] to T...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    相关资源
    最近更新 更多