![](/img/trans.png)
[英]What's the practical difference between `class <T extends A> { }` and a `class { }` that uses A?
[英]What is the difference between Class<? extends T> and Class<? extends ?> in Java?
我在我的應用程序中瀏覽了一些遺留代碼,我發現了 Java 泛型的用途。
你能告訴我,這兩者之間有什么區別嗎?
Class<? extends T>
和
Class<? extends ?>
我不清楚如何以及何時使用這些泛型。
Class<? extends ?>
Class<? extends ?>
不是 java 中的有效類型。
Class<? extends T>
Class<? extends T>
是 java 中的有效類型。
Class<? extends T
Class<? extends T
> 示例:
Class<? extends Number>
Class<? extends Number>
可以是Class<Number>
、 Class<Integer>
、 Class<BigDecimal>
等……換句話說,任何擴展Number
類的類。 那是在編譯時檢查的!
另一方面Class<? extends ?>
Class<? extends ?>
可以被解釋為擴展任何類的任何類的類型,這是無稽之談。
編輯:您要求使用。 下面是一個使用List<? extends Number>
List<? extends Number>
計算列表中所有數字的總和和平均值:
public class Help {
private static BigDecimal sum(List<? extends Number> list) {
return list == null || list.isEmpty() ?
BigDecimal.ZERO :
list.stream()
.map(n -> new BigDecimal(n.doubleValue()))
.reduce(BigDecimal::add)
.get();
}
private static BigDecimal average(List<? extends Number> list) {
return list == null || list.isEmpty() ?
BigDecimal.ZERO :
sum(list).divide(BigDecimal.valueOf(list.size()), MathContext.DECIMAL32);
}
public static void main(String[] args) {
List<Number> numbers =
List.of(
1.0D, /*double*/
2.0F, /*float*/
3L, /*long*/
new BigInteger("4"), /*BigInteger*/
new AtomicInteger(5), /*just for test*/
(int)'a' /*int*/
);
System.out.println("sun of " + numbers + " = " + sum(numbers));
System.out.println("avg of " + numbers + " = " + average(numbers));
System.out.println("sum of empty list = " + sum(List.of()));
System.out.println("avg of empty list = " + average(List.of()));
System.out.println("sum of null list = " + sum(null));
System.out.println("avg of null list = " + average(null));
}
}
我希望你能從這段代碼中得到一些基本的技巧。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.