java 泛型中的编译错误-为什么不允许像T扩展SomeClass?

yk9xbfzb  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(108)

我正在深入研究泛型,当我觉得我知道,我得到证明,否则由编译器:-)
来源:

public class Generics3 {

    <T> void printExtends_compile_error( List<T extends Dog> t) {
        
    }

    void printExtends_correct_syntax( List<? extends Dog> t) {
        
    }

    <T> void printSuper_compile_error(List<T super Dog> t) {
        
    }

    void printSuper_correct_syntax(List<? super Dog> t) {
        
    }

class FatherOfAllAnimal{}
class Animal extends FatherOfAllAnimal{}
class Dog extends Animal {}
class Cat extends Animal {}
class Tiger extends Animal {}
class Lion extends Animal {}

class Dog1 extends Dog{}
class Dog2 extends Dog1{}
class Dog3 extends Dog2{}

以**_compile_error结尾的方法是编译错误-为什么它们无效?那么,我可以使用superextends”只带通配符吗?
有人能帮忙清理一下吗?

nkoocmlb

nkoocmlb1#

printExtends_compile_errorprintSuper_compile_error无效是因为您试图在方法的参数声明中使用有界类型参数,这在Java中是不允许的。
在Java中,当声明一个有界类型参数时,它必须在类或方法级别完成,而不是在方法的参数级别。
所以你要做的是

<T extends Dog> void printExtends_compile_error( List<T> t) {

}

但是super不能用作类型参数,而只能用作通配符。

<T super Dog> void printSuper_compile_error(List<T> t) {

}

仍然是无效的。

相关问题