Java 8和Java 7与类型参数绑定中的泛型方法有什么区别?

问题描述 投票:-2回答:2
public class GenMethodDemo2 {
    static <T, V extends T> boolean isIn(T x, V[] y){
        for (int i = 0; i < y.length; i++) {
            if (x.equals(y[i])) return true;
        }
        return false;
    }

    @Test
    public void test(){
        Integer[] nums = {1,2,3,4,5};
        if(isIn("java",nums)) System.out.println("java is in nums");
        if(!isIn("java",nums)) System.out.println("java is not in nums");
    }
}

当我使用jdk8时,此代码运行良好,结果为java is not in nums

但是当我更改为jdk7时,将不会遵循相同的代码,并且提示味精为Inferred type 'java.lang.Integer' for type parameter 'V' is not within its bound; should extend 'java.lang.String'

我想知道:当函数显式定义类型参数绑定到V extends T时,jdk8如何编写此代码?>

public class GenMethodDemo2 {static boolean isIn(T x,V [] y){for(int i = 0; i

我相信与Java 7相比,Java 8中的泛型方法在类型推断方面有所改进,尽管我不确定它能否解释您所看到的差异。无论如何,当推论失败时,您总是可以显式地提供类型见证,以向编译器证明存在将要满足边界的类型,例如:

if (GenMethodDemo2.<Object, Integer>isIn("java",nums))
    System.out.println("java is in nums");

在这种情况下,类型变量TV都可以始终选择为Object,并且它将不接受任何更少的参数集(因为任何T将是Object的子类型]和任何V[]将是Object[]的子类型)。因此,您的方法实际上不需要任何泛型:

static boolean isIn(Object x, Object[] y){
    for (int i = 0; i < y.length; i++) {
        if (x.equals(y[i])) return true;
    }
    return false;
}

签名类似

static <T, V extends T> boolean isIn(T x, V[] y)

没有什么比]好>

static boolean isIn(Object x, Object[] y)

因为调用者始终可以将Object用作T,这允许将任意对象用作第一个参数,以及数组元素的任意引用类型。

因此,将方法更改为

@Test
public void test(){
    Integer[] nums = {1,2,3,4,5};
    if(GenMethodDemo2.<Object,Integer>isIn("java",nums))
            System.out.println("java is in nums");
    if(!GenMethodDemo2.<Object,Integer>isIn("java",nums))
            System.out.println("java is not in nums");
}

可以在所有支持泛型的Java版本中进行编译。

由于协变量数组,它也可以指定]

if(GenMethodDemo2.<Object,Object>isIn("java",nums))
        System.out.println("java is in nums");
if(!GenMethodDemo2.<Object,Object>isIn("java",nums))
        System.out.println("java is not in nums");

Java 8的类型推断不会更改哪种方法调用是有效的,它只会使执行有效的调用更加容易,因为您需要显式指定类型参数的情况较少。

java generics java-8 java-7
2个回答
0
投票

我相信与Java 7相比,Java 8中的泛型方法在类型推断方面有所改进,尽管我不确定它能否解释您所看到的差异。无论如何,当推论失败时,您总是可以显式地提供类型见证,以向编译器证明存在将要满足边界的类型,例如:


0
投票

签名类似

© www.soinside.com 2019 - 2024. All rights reserved.