1

考虑下面的例子

class test<E>{
    public int getNum(int i){
        return i;
    }

    public E getNum1(E i){
        return i;
    }

    public static <E> E getNum(E i){
        return i;
    }
    }

第一种方法声明:返回类型已知

第二种方法声明:返回类型有些未知

第三种方法声明:返回类型未知 + 静态

问题:静态方法用于泛型时,<E>必须指定类型参数。为什么会这样?或者类型参数到底是什么意思,它的目的是什么?当方法是非静态的时,我们没有类型参数,尽管在这种情况下我们<E>在类声明中,例如public class <E> {...}

在通配符上考虑这个

//This does not compile, how to make it correct
    public static  getIndex(List<?>, int index){
        return list.get(index);
    }

    public static <E> E getIndex1(List<E> list, int index){
        return list.get(index);
    }

同样,第一种方法无法编译。我不知道如何使用无界通配符作为返回类型使其编译

上面的两种方法声明有什么区别?

通配符?表示任何类型并E表示某些未知类型。

既然any typesome unknown type正确的,那又有什么关系呢?

4

1 回答 1

5

问题:静态方法用于泛型时,必须指定类型参数。为什么会这样?或者类型参数到底是什么意思,它的目的是什么?当方法是非静态的时,我们没有类型参数,尽管在这种情况下我们在类声明中,例如 public class {...}

一个static方法不属于一个实例,它属于一个类。类没有泛型类型(实例有)。

所以没有意义

class test<E>{
    public static E getNum(E i){
        return i;
    }
}

你会得到Cannot make a static reference to the non-static type E.

类声明中的类型参数用于实例

test<String> anInstance = new test<String>();

//This does not compile, how to make it correct
public static  getIndex(List<?>, int index){
    return list.get(index);
}

因为您没有提供返回类型并且List<?>参数没有变量声明。


既然any typesome unknown type正确的,那又有什么关系呢?

当你做一个泛型类型声明时

public class Test<E> {}

E不是未知类型。它是在您创建实例时选择的定义明确的类型。

Test<String> test = new Test<>();

EString

引用路易斯·瓦瑟曼的话

E 表示某些未知类型,您可以命名并稍后参考。? 表示您没有命名且以后无法引用的某些未知类型。


阅读有关泛型的官方 Java 教程,您会收获很多。

于 2013-09-06T19:03:47.337 回答