java - 静态泛型方法

标签 java generics

您能解释一下为什么以下方法有效吗?

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 v2doSomethingStatic 中应该是相同的类型,但我仍然可以传递不同的类型(整数和字符串)。

如果 doSomethingStatic() 默认采用一个通用的父类(super class),为什么 doSomethingStaticList() 不能与不同的类型一起工作?

最佳答案

在非静态情况下,您定义 T作为 String当您创建 GenericsTest 的实例时.因此通过 int将给出编译错误。如果你这样做了gt.doSomething(1, 2)它也会失败。

在静态情况下,您不定义 T手动,它是从参数导出的。这将是两个类的第一个公共(public)父类(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/

相关文章:

java - 在java中,一个包同时包含类和子包是否被认为是不好的做法?

java - Spring 3 : map page. html 到 page.jsp

java - 通用使用 2 个相同的类但来自不同的包

java - 泛型类型的实例化?

java - 为什么<? extends Parent> 不是 Java 中泛型集合的默认行为吗?

java - Geotools:wgs84 中缓冲区的边界框

java - 在 persistence.xml 之外定义 jpa 实体类

java - Log4j2 不登录日志文件

java - 我正在为 Java Stream 中的泛型而苦苦挣扎

java - Haskell 中的类型构造函数和 java 泛型类型有什么不同?