public class MyGeneric<T, E> {}
public class Extend1<T, E> extends MyGeneric<T, E> {}
public class Extend2 extends MyGeneric<String, Object> {}
据我所知,上面例子中的两个子类都是有效的。我想知道Java如何知道在实例化子类时给定的超类中的类型何时会被定义,以及何时它们是实际的类名(即它如何知道T、E不是类名)?
另外,是否可以使用多个字母表示泛型类型(即使很少见)?如果(通过某些严重的规划错误)这些类型与现有类冲突怎么办?
public class E{}
public class Foo<E>{}
那么接下来会发生什么?
编辑:感谢您的迅速回答。为了回答我的第一个问题,Joachim的答案是最有效的。(原文链接)
为了回答这个附带问题,aioobe的答案更清晰。(原文链接)
java.lang.String
没有实际关系,除了让人们感到困惑并隐藏类型的简称。 - Joachim SauerExtend1<T, E>
中,T
和E
是类型参数。当发生泛型类型调用时,extends MyGeneric<T, E>
中的T
和E
将被替换为类型参数,以替换Extend1<T, E>
中的类型参数T
和E
。因此,实际上,泛型和非泛型类型都可以仅扩展/实现非泛型类型。 - rosshjb