gpt4 book ai didi

Java泛型。为什么要编译?

转载 作者:搜寻专家 更新时间:2023-10-30 19:56:54 26 4
gpt4 key购买 nike

abstract class Type<K extends Number> {
abstract <K> void use1(Type<K> k); // Compiler error (Type parameter K is not within its bounds)
abstract <K> void use2(Type<? extends K> k); // fine
abstract <K> void use3(Type<? super K> k); // fine
}

方法泛型类型 K 隐藏了类泛型类型 K,所以 <K>不匹配 <K extends Number>use1() .编译器对新泛型类型一无所知<K>use2()use3()但编译仍然是合法的。为什么 <? extends K> (或 <? super K> )匹配 <K extends Number>

最佳答案

你的问题是有两个K类型。如果重命名可能会更清楚。

abstract class Type<N extends Number> {
abstract <K extends Number> void use1(Type<K> k); // fine
abstract <K> void use2(Type<? extends K> k); // fine
abstract <K> void use3(Type<? super K> k); // fine
}

在某些情况下,您必须提供编译器可以推断出的重复信息,而在其他情况下则不需要。在 Java 7 中,它添加了一个 <>。菱形表示法告诉编译器推断它以前没有推断的类型。


为了说明我的意思。以下是创建泛型类实例的不同方法。有些需要类型给出两次,有些只需要一次。编译器可以推断类型。

一般来说,Java 不会在大多数其他语言中推断类型。

class Type<N extends Number> {
private final Class<N> nClass;

Type(Class<N> nClass) {
this.nClass = nClass;
}

static <N extends Number> Type<N> create(Class<N> nClass) {
return new Type<N>(nClass);
}

static void main(String... args) {
// N type is required.
Type<Integer> t1 = new Type<Integer>(Integer.class);

// N type inferred in Java 7.
Type<Integer> t2 = new Type<>(Integer.class);

// type is optional
Type<Integer> t3 = Type.<Integer>create(Integer.class);

// type is inferred
Type<Integer> t4 = create(Integer.class);
}

关于Java泛型。为什么要编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7555623/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com