gpt4 book ai didi

java - Java 中的静态和非静态 vs 泛型和通配符

转载 作者:行者123 更新时间:2023-11-29 07:54:43 24 4
gpt4 key购买 nike

考虑下面的例子

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 type 以来,这有什么关系?是some unknown type对吗?

最佳答案

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

A 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 .

引用Louis Wasserman

E indicates some unknown type that you can name and refer to later. ? indicates some unknown type that you don't name and can't refer to later.


阅读 official Java tutorial on Generics 会收获很多.

关于java - Java 中的静态和非静态 vs 泛型和通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18664780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com