【问题标题】:Type arguments in JavaJava 中的类型参数
【发布时间】:2013-11-13 00:53:02
【问题描述】:

以下两个声明有区别吗?

public<C extends Condition<E>> List<E> search (C condition)

public List<E> search (Condition<E> condition)

有一个明显区别:在第一种情况下,C 可以用在search 的主体中。但是假设C不会用在search的正文中:还有区别吗?

【问题讨论】:

  • 是的,有 - 第二个更容易阅读:-) :-) :-)
  • 即使C用在search的主体中,从外部代码的角度来看,在功能上也没有区别,因为第二个@987654328 @ 仍然可以在内部调用第一个 search

标签: java generics


【解决方案1】:

不,没有有用的区别。区别可以简化如下。

<T> void m(T object)

void m(Object object)

虽然第一个可以调用 this.&lt;String&gt;m(42) 并且它不会编译 - 但这样做没有任何价值。

泛型方法的价值来自于其类型参数表达的某种关系,例如:

<T> T giveItBackToMe(T object) {
    return object;
}

...

String s = giveItBackToMe("asdf");
Integer i = giveItBackToMe(42);

或者:

<T> void listCopy(List<T> from, List<? super T> to) {
    to.addAll(from);
}

...

List<Integer> ints = Arrays.asList(1, 2, 3);
List<Number> nums = new ArrayList<>();
listCopy(ints, nums);

【讨论】:

    猜你喜欢
    • 2020-02-10
    • 2022-01-21
    • 2021-02-13
    • 2019-08-17
    • 1970-01-01
    • 2014-09-18
    • 2016-09-16
    • 2023-03-18
    • 2012-02-07
    相关资源
    最近更新 更多