【问题标题】:Java base as Template parameter [duplicate]Java基础作为模板参数[重复]
【发布时间】:2018-01-21 01:39:27
【问题描述】:

我是半 Java 识字者,并在 Groovy 中尝试过一些东西。

在 Groovy/Java 中是否可能:

public class A {
}
public class B {
}

public class C<Ta extends A, Tb extends B> extends Ta {
   public Ta[] bArray;
   public Tb[] getAllBs()
   {
      Tb[] ret = new Tb[0];
      ....
      return ret;
   }
}

以上定义没有显示任何错误。但是当我尝试使用 C 作为另一种类型的基类时,出现错误:

public class DummyA extends A {};
public class DummyB extends B {};

public class D extends C<DummyA, DummyB> {
}

上面的定义显示错误'D 类型的层次结构不一致'。

如果我将 C 重新定义为以下任何一种,错误就会消失:

//remove the base class, Ta, from C
public class C<Ta extends A, Tb extends B> {
....
}

(或)

//Use the class A, instead of generic type Ta, as base class
public class C<Ta extends A, Tb extends B> extends A {
....
}

我一定是违反了一些 Java 规则,但无法识别

【问题讨论】:

  • 对我来说,它在Tb[] ret = new Tb[0]; 上失败并带有消息Cannot create a generic array of Tb

标签: java generics inheritance


【解决方案1】:

这是不可能的,因为 D 的超类的超类是“通用的”。
并且不允许使用泛型超类型!这是允许的:

public class C<B extends WhatElse> extends ArrayList<B>{

因为超类显然在 java.lang 包中,而您只为超类提供“自己的”泛型参数。
而java需要一个清晰的结构来编译类! 例如:您应该能够覆盖哪些方法?

【讨论】:

    【解决方案2】:

    这一行的一些信息:Tb[] ret = new Tb[0]; 将永远无法工作!
    你不能生成泛型数组,你也不能使用new Tb();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多