gpt4 book ai didi

java - `class { }` 和使用 A 的 `class { }` 之间的实际区别是什么?

转载 作者:行者123 更新时间:2023-12-01 11:55:34 25 4
gpt4 key购买 nike

我认为,在大多数情况下,我了解有界类型,以及例如 List<? extends MyClass> 之间的差异。 , List<? super MyClass>List<MyClass> .但是说到类和泛型方法的实现,不明白是什么<T extends MyClass>带到餐 table 上。

取自 the docs in Oracle :

[...] a method that operates on numbers might only want to accept instances of Number or its subclasses. This is what bounded type parameters are for.

public class Box<T> {

private T t;

public void set(T t) {
this.t = t;
}

public T get() {
return t;
}

public <U extends Number> void inspect(U u){
System.out.println("T: " + t.getClass().getName());
System.out.println("U: " + u.getClass().getName());
}

public static void main(String[] args) {
Box<Integer> integerBox = new Box<Integer>();
integerBox.set(new Integer(10));
integerBox.inspect("some text"); // error: this is still String!
}
}


这对我来说没有多大意义。如果我从方法中删除泛型并将参数类型设为 Number ...

    public void inspect(Number u){
System.out.println("T: " + t.getClass().getName());
System.out.println("Second: " + u.getClass().getName());
}

它仍然可以正常工作。我看不出我在哪里获得或失去了类型安全,尽管这可能不是重点?

同样的事情:

class A { void foo() { } }

class B extends A { void bar() { } }

class Generic<T extends B> {
void baz(T obj) {
obj.foo();
obj.bar();
}
}

// vs

class NonGeneric {
void baz(B obj) {
obj.foo();
obj.bar();
}
}


这些有什么区别?

最佳答案

在您的示例中,没有实际区别。

主要的实际区别是当您使用泛型返回类型时。

但即使没有,Generic<T extends B>NonGeneric不一样,因为如果我们有 class C extends B ,然后 Generic<C>NonGeneric 不一样, 自 NonGeneric将允许非 C 对象调用 baz ,这是错误的。

关于java - `class <T extends A> { }` 和使用 A 的 `class { }` 之间的实际区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61262543/

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