Ива*_*вац 13 java generics methods
我不久前学过java泛型,但现在我正在学习集合,发现了一些我不理解的代码.这是代码:
static <E> List<E> nCopies(int n, E value)
Run Code Online (Sandbox Code Playgroud)
它来自课堂java.util.Collections
.
我的问题是为什么有:
<E> List<E>
Run Code Online (Sandbox Code Playgroud)
而且不仅仅是
List<E>
Run Code Online (Sandbox Code Playgroud)
显然我错过了什么,有人可以为我澄清一下吗?
Fra*_*ulo 14
您可以使用它<E>
来表示您定义的方法.
泛型的最常见的例子是有一个这样的典型类:
public class SomeClass<E> {
...
}
Run Code Online (Sandbox Code Playgroud)
然后,当您创建该类的新对象时,您可以直接定义类型:
new SomeClass<String>();
Run Code Online (Sandbox Code Playgroud)
这样,该类中引用的任何方法都将视为该实例的String.
现在考虑一个静态方法(它没有绑定到类的任何特定实例),为了代表该方法,您使用了另一种适用于方法的典型,如下所示:
static <E> List<E> nCopies(int n, E value)
Run Code Online (Sandbox Code Playgroud)
你使用<E>
返回类型之前说"这个特定的方法会在执行时考虑一些E".什么<E>
会当你调用的方法来决定:
nCopies(3, "a");
Run Code Online (Sandbox Code Playgroud)
在这个例子<E>
中将是一个String,所以返回类型将是一个List<String>
.
最后,您甚至可以将它们混合在一起:
public class SomeClass<E> {
public <F> void doSomething(E e, F f){
...
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果你有SomeClass的实例,doSomething方法中的E将始终是String(对于该实例),但F可以是你想要的任何东西.
将<E>
需要告诉编译器要使用E
的类型参数,你做同样的方式,当你犯了一个泛型类(如public interface List<E>
)。
由于在接口或类名称上没有规则(只有约定)超过一个字符,并且没有类型参数名称必须是一个字符的规则(只有约定),所以编译器不会知道您打算将其作为类型参数而不是具体的类名。
许多人一直在说这与静态方法直接相关。那是不对的。您也可以有一个实例方法,该实例方法在其自身的类型参数上也具有通用性(尽管通常,类型参数将与类类型参数相关)。
这是您可能有此的示例:
public class MyList<E> {
public <N super E> MyList<N> createCopy() {
//...
}
}
Run Code Online (Sandbox Code Playgroud)
此方法将允许您创建列表的副本,但不限制您使用与列表相同的类型,而是允许您使用超类型。例如:
MyList<Integer> integers = createList(1, 2, 5);
MyList<Number> numbers = integers.createCopy();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1865 次 |
最近记录: |