针对多种类型参数的Java泛型问题

时间:2016-10-19 18:17:36

标签: java generics

我有这段代码:

public interface IDimension<S extends IDimension<S,T>, T extends Number> extends Comparable<S> {
  T toNumber();

  default T toBaseNumber() {
    return toNumber();
  }

  S fromNumber( T units );

  Class<T> numberType();
}

当我实施IDimension如下(Implementation1)时,我得到'Type parameter 'TestBaseSample' is not within its bound; should implement 'IDimension<TestBaseSample<Float,Integer>, java.lang.Long>'错误:

实施1:

class TestBaseSample<Integer, Float> 
    implements IDimension<TestBaseSample<Float, Integer>, Long> { 
}

我理解为什么'Implementation1'会出错,但却无法理解为什么'Implementation2'和'Implementation3'有效?

实施2:

class TestBaseSample2<Integer, Float> 
    implements IDimension<TestBaseSample2<Float, Float>, Long> {
}

实施3:

class TestBaseSample3<Integer, Float> 
    implements IDimension<TestBaseSample3<Integer, Integer>, Long> {
}

2 个答案:

答案 0 :(得分:1)

看起来您正在尝试创建一个具体类型,但实际上您正在创建泛型参数并为它们提供java类的名称。

如果我们将通用参数更改为T和S

,请考虑您的第一个示例TestBaseSample2
class TestBaseSample2<T, S> 
    implements IDimension<TestBaseSample2<S, S>, Long> {
}

现在,您应该能够将S提供的实例设为长,T可以为其他任何内容。

这是一个更简单的例子。

static class OtherList<Integer> extends ArrayList<Integer>{}

public static void main (String[] args) throws java.lang.Exception
{
    OtherList<String> list = new OtherList<>();
    list.add("this");
    System.out.println(list.size());
}

答案 1 :(得分:0)

从您的实现中删除所有类型(并且永远不会使用类名称来命名泛型参数,尤其是来自JDK的类 - 使用单个字母):

class TestBaseSample implements IDimension<TestBaseSample, Long> { 
}

class TestBaseSample2 implements IDimension<TestBaseSample2, Long> {
}

class TestBaseSample3 implements IDimension<TestBaseSample3, Long> {
}