首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用自引用类型的泛型类型的Java子类化问题

使用自引用类型的泛型类型的Java子类化问题
EN

Stack Overflow用户
提问于 2012-02-16 23:30:24
回答 1查看 1.8K关注 0票数 4
代码语言:javascript
复制
import java.util.*;

// Let's define a self-referential type:
class SelfReferential<T extends SelfReferential<T>> {}

//A complete (i.e. not parameterized) subtype of SelfReferential:
class SubclassA extends SelfReferential<SubclassA> {}

//A partial (i.e. parameterized) subtype of SelfReferential:
class SubclassB<T extends SubclassB<T>> extends SelfReferential<T> {}

//Two complete subtypes of SubclassB
class SubclassB1 extends SubclassB<SubclassB1> {}    
class SubclassB2 extends SubclassB<SubclassB2> {}

//Now let's define a generic type over SelfReferential:
class Generic<T extends SelfReferential<T>> {}

//No problem creating a subtype for A, B1 or B2
class GenericA extends Generic<SubclassA> {}   
class GenericB1 extends Generic<SubclassB1> {}    
class GenericB2 extends Generic<SubclassB2> {}

//We can also defined a parameterize type for specific types extending SubclassB
class GenericB<T extends SubclassB<T>> extends Generic<T> {}

//However, it does not seem possible to define a non-parameterized subtype of Generic of ANY subtype of SublassB
//My goal is to provide a type alias for GenericB<? extends SubclassB<?>> to avoid 
//having to mention it everywhere in the code. This is like providing an alias for ArrayList<String> using 
class ArrayListOfString extends ArrayList<String> {}

//Unsucessful attempts:
//class GenericAnyB extends Generic<SubclassB> {} //ERROR: bound mismatch
//class GenericAnyB extends Generic<SubclassB<?>> {} //ERROR: bound mismatch
//class GenericAnyB extends Generic<? extends SubclassB<?>> {} //ERROR: invalid syntax: a supertype cannot specify any wildcard
//class GenericAnyB extends Generic<SubclassB<? extends SubclassB>> {} //ERROR: bound mismatch
//class GenericAnyB extends Generic<SubclassB<SubclassB<SubclassB<SubclassB<SubclassB<SubclassB>>>>>> {} // well...
//class GenericAnyB extends <T extends SubclassB<T>> Generic<T> {} //ERROR: this syntax is illegal

最重要的是,我不能在扩展子句中指定“引用周期”。

问:这是Java语言的限制吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-16 23:44:16

你是对的,这是不可能的,就像声明一个具有自引用类型的变量没有通配符或原始类型是不可能的一样。您不能直接实例化SubclassB,原因与您不能在没有自引用类型参数的情况下将其用作绑定一样。

有关此限制的更多讨论,请参阅此帖子:Self bound generic type with fluent interface and inheritance

底线是,要使用SubclassB作为绑定,GenericAnyB本身必须是泛型的:

代码语言:javascript
复制
class GenericAnyB<T extends SubclassB<T>> extends Generic<T> { }

这只是在层次结构中添加了一个额外的步骤,然后才能使用任何东西:

代码语言:javascript
复制
class GenericB1 extends GenericAnyB<SubclassB1> { }   
class GenericB2 extends GenericAnyB<SubclassB2> { }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9314046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档