java - Angelika Langer GenericsFAQ - 我可以像使用任何其他类型一样使用原始类型吗?

标签 java generics

我正在阅读 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>

替换CopyableImplElem看看是否满足声明。

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> 的子类型尽管StringCharSequence 的子类.因此,对于此声明,您只能实例化 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/

相关文章:

java - 如何从 Java 中的字符串表示中获取语言环境?

java - Java toString输出中@和#的区别?

java - 修复通用类型使用的警告消息

c# - 如何将匿名对象指定为泛型参数?

c# - 使用 GetType() 检查其类型后,将泛型类型转换为引用类型。如何?

.net - List<T>.Remove(T) 或 List<T>.RemoveAt(int) 方法哪个更快?

generics - 是否有约定将 ?Sized by 本身写为特征界限?

java - 消除面板上复选框之间的巨大差距

java - Spring 数据蒙戈: Find by array intersection

java - 在 AnnotationProcessor 中访问 javac 选项