扩展的通用扩展或通用

时间:2016-10-20 13:37:39

标签: java generics inheritance

我发现这种方法有效:

public class Test<T extends Number>{

以及

public class Test<T> extends Number{

是否缺少任何良好的做法,因为这两种方法都会给我相同的结果,只有第二种方法迫使我实施抽象方法。

public int intValue() {
    throw new UnsupportedOperationException();
}


public long longValue() {
    throw new UnsupportedOperationException();
}


public float floatValue() {
    throw new UnsupportedOperationException();
}


public double doubleValue() {
    throw new UnsupportedOperationException();
}

感谢

1 个答案:

答案 0 :(得分:1)

  

我发现这种方法有效......以及......

嗯,它们都是有效的Java。

  

因为两种方法都会给我相同的结果

不,他们的意思非常不同。

让我们调用实现两种方法的类Test1Test2

class Test1<T extends Number> { ... }
class Test2<T> extends Number { ... }

Test1<Integer> a1 = new Test1<>();  // OK.
Test2<Integer> a2 = new Test2<>();  // OK.

Test1<Object> b1 = new Test1<>();   // Compiler error: Object not in bounds.
Test2<Object> b2 = new Test2<>();   // OK - T isn't bounded.

Number c1 = new Test1<Integer>();   // Compiler error: a Test1 isn't a Number.
Number c2 = new Test2<Integer>();   // OK.

所以,这两个类不等同。

你应该选择的那个取决于你想要达到的目标。