我正在阅读 AgelikaLangerDoc 的文档.我刚开始读书 本文。我在代码中看到了以下语法。
interface Copyable<T>{
T copy();
}
final class Wrapped<Elem extends Copyable<Elem>>{
}
我无法理解以下泛型语法含义。
<Elem extends Copyable<Elem>>
我知道它很基础,但泛型真的很棘手。为什么我们需要这样说呢? 我们本可以说些类似的话
final class Wrapped<Copyable<Elem>>{
}
我知道它不合法,但即使是上面的语法也不容易理解。有人可以 解释这部分?
最佳答案
声明:
class Wrapped<Elem extends Copyable<Elem>>
只是说你只能实例化Wrapped
子类型为 Copyable
的类型.注意 Elem
部分。这意味着子类型 Elem
应该是 Copyable<Elem>
的子类型.
例如,假设您有一个实现该通用接口(interface)的类:
interface Copyable<T>{
T copy();
}
class CopyableImpl implements Copyable<CopyableImpl> {
CopyableImpl copy() { ... }
}
现在您可以实例化 Wrapped
通用类型 CopyableImpl
像这样:
Wrapped<CopyableImpl>
替换CopyableImpl
与 Elem
看看是否满足声明。
CopyableImpl extends Copyable<CopyableImpl>
Elem extends Copyable<Elem>
因此,它是 Wrapped
的有效类型参数.
但是,如果你的类是这样的:
class SomeCopyable implements Copyable<OtherCopyable> {
OtherCopyable copy() { ... }
}
你不能实例化Wrapped
此类的通用类型,因为它不满足 Wrapped
的类型参数.
SomeCopyable extends Copyable<OtherCopyable>
Elem extends Copyable<Elem2> // Elem 2 is different from Elem
关于您的建议:
class Wrapped<Copyable<Elem>>
no 此声明与原始声明完全不同。考虑到泛型类型是不变的,从某种意义上说,一个 List<String>
不是 List<CharSequence>
的子类型尽管String
是 CharSequence
的子类.因此,对于此声明,您只能实例化 Wrapped
输入 Copyable
像这样输入参数:
Wrapped<Copyable<String>>
Wrapped<Copyable<Integer>>
Wrapped<CopyableImpl> // Wrong. This doesn't match the type declaration.
进一步阅读:
关于java - Angelika Langer GenericsFAQ - 我可以像使用任何其他类型一样使用原始类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18444652/