我有这段代码:
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> {
}
答案 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> {
}