您能解释以下原因的原因吗?

public class GenericsTest<T> {

    public void doSomething(T v1, T v2) {

    }

    public static <T> void doSomethingStatic(T v1, T v2) {

    }

    public static <T> void doSomethingStaticList(List<T> v1, List<T> v2)
    {

    }

    public static void main(String[] args) {
        GenericsTest<String> gt = new GenericsTest<>();

        // OK
        gt.doSomething("abc", "abc");

        // Not OK
        gt.doSomething(1, "abc");

        // OK
        doSomethingStatic(1, 2);

        // Still OK
        doSomethingStatic(1, "abc");

        // So why is this not OK?
        List<String> list1=new LinkedList<>();
        List<Integer> list2=new LinkedList<>();
        doSomethingStaticList(list1,list2);
    }
}
T v1, T v2应该与doSomethingStatic中的类型相同,但是我仍然可以传递不同的类型(整数和字符串)。

如果doSomethingStatic()默认采用一个公共(public)的父类(super class),为什么doSomethingStaticList()不能与其他类型一起使用?

最佳答案

在非静态情况下,当创建T实例时,您将String定义为GenericsTest。因此,传递int将产生编译错误。如果您执行了gt.doSomething(1, 2),它也会失败。

在静态情况下,您无需手动定义T,它是从参数派生的。这将是这两个类的第一个通用父类(super class)-在这种情况下为Object。您可能要使用有界通配符,例如<T extends Number><T extends CharSequence>

请注意,这里有两个不同的T:

  • GenericsTest<T>
  • public static <T> void doSomethingStatic(T v1, T v2)

  • 泛型参数的声明是在您编写<T>时进行的声明。在这种情况下,可以使用不同的字母以避免混淆。

    关于java - 静态通用方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39849482/

    10-10 19:36