【问题标题】:Generics , force type Void when extended subclass eventually does not need to be aware of type泛型,在扩展子类时强制类型 Void 最终不需要知道类型
【发布时间】:2012-07-24 11:49:14
【问题描述】:

一个抽象类被声明为

 myClass<E extends Number, D extends Number>

子类是

 final mySubClass<Double,Integer>
 final myOtherSubclass<Double,Double>

假设有一个子类没有第一种类型的参数化过程,我的意思是,类型将被忽略。有什么办法可以将其设置为 Void、Null 或其他什么?

final mySubClassThatDontUseFirstType<Void,Integer>

例如,如果它内部有一个内部 List,那么这个列表就是 List,因为它永远不会被使用。

【问题讨论】:

  • Everything extends Object 和 BTW 写 extends Object 正是出于这个原因,是多余的。你的抽象类不能像你说的那样声明,因为类声明中不接受通配符。这个问题对我来说只是半清楚。
  • 对不起,你是正确的通配符,我改变了它。这是一个例子,我可以使用比 Object 更抽象的术语。我不确定 Void 扩展了对象,这就是我问的原因,因为我看到人们在其他地方使用像 Void 这样的东西
  • Void 只不过是另一个类,它不是 Number 的子类。这就是为什么这行不通。

标签: java generics inheritance types void


【解决方案1】:

有什么办法可以将其设置为 Void、Null 或其他什么?

不,不是真的。无论您选择什么,它都必须是 Number 的子类型(这只是 Java 语言的要求)。

你可以做的是创建一个不可实例化的类VoidNumber

class VoidNumber extends Number {

    // Private constructor
    private VoidNumber() {
    }

    ...
}

并用它来证明它没有被使用。

【讨论】:

  • 好的,如果 Void 扩展了对象,那么我知道我必须更改示例类型。如果存在 Void 类型为什么不编译?
【解决方案2】:

我认为问题在于 Void 没有扩展 Object,因为如果不是,如果我认为它可以工作

当然类java.lang.Void扩展Object,就像任何其他Java类扩展Object一样。

请注意,Voidvoid 不同。 Void 大写 V 有点像原始类型的包装类(int -> Integerlong -> Long 等)。

请注意,编译器会将Void 视为任何其他类。这意味着如果您有一个返回Void 的方法,它必须返回一个值;例如,该方法必须以return null; 结尾。它不像void,编译器将其理解为“不返回任何内容”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多