如何解决为什么在Java中返回类型之前必须声明类型参数?
在不介绍泛型的情况下,我将立即发布我的问题。为什么这样正确:
static<T extends Object> void m1(List<T> list){
//some code
}
这不是(不编译):
static void m2 (List<T extends Object> list){
//some code
}
请记住,我们可以以相同的方式使用通配符,这样可以很好地进行编译:
static void m2 (List<? extends Object> list){
//some code
}
总而言之,为什么我们要在参数中使用通配符声明,而使用 type参数则必须在返回类型之前声明它?
解决方法
有两个要点。
首先,就像@akuzminykh在对问题的评论中说的那样,?
通配符基本上只是一种告诉编译器的方式:“我不知道这将是什么,只是假设它可能是从此类/接口派生的任何东西,kthxbye”。它没有声明方法中可以使用的任何参数,没有可以调用的标识符,也没有任何东西。但是,类型参数确实可以做到这一点,而且,如果您声明一个新参数,则与“调用”不需要声明的通配符完全不同。
第二,考虑如何为泛型类声明类型参数。您认为这样就够了吗?
public class Foo {
public T extends CharSequence getBar() {...}
}
public class Foo {
public <T extends CharSequence> getBar() {...}
}
否,这两个选项都不起作用。为了在类中使用泛型类型参数,您必须将其与类型本身一起声明,而不是与使用它们的方法/字段一起声明。像这样:
public class Foo<T extends CharSequence> {
public T getBar() {...}
}
并且为了在方法中使用泛型类型参数,必须将其与方法本身或包含该方法的类型一起声明,而不是与使用它们的方法参数一起声明。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。