编译错误在泛型中 – 为什么不允许像 “T extends SomeClass” 这样的形式?

huangapple go评论60阅读模式
英文:

Compile error in Generics - why not allowed like T extends SomeClass?

问题

以下是翻译好的部分:

我正在深入研究泛型当我认为我了解时编译器又证明我错了 :-)

这里是源代码

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** 结尾的是编译错误 - 为什么它们不合法那么我只能在通配符中使用 `super``extends`

请注意,代码中的尖括号和其他特殊字符已经得到处理,以适应纯文本环境。

英文:

I am delving more into Generics, when I feel I know, I get proved otherwise by compiler 编译错误在泛型中 – 为什么不允许像 “T extends SomeClass” 这样的形式?

Here's source:

public class Generics3 {

	&lt;T&gt; void printExtends_compile_error( List&lt;T extends Dog&gt; t) {
		
	}

	void printExtends_correct_syntax( List&lt;? extends Dog&gt; t) {
		
	}

	&lt;T&gt; void printSuper_compile_error(List&lt;T super Dog&gt; t) {
		
	}


	void printSuper_correct_syntax(List&lt;? super Dog&gt; 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{}

The methods ending with _compile_error are compile errors - why they aren't valid? So, can I used super or extends only with wild card?

答案1

得分: 2

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) {

}

仍然是无效的。

英文:

printExtends_compile_error and printSuper_compile_error are not valid is because you are trying to use bounded type parameters in a method's parameter declaration, which is not allowed in Java.

In Java, when declaring a bounded type parameter, it must be done at the class or method level, and not at the method's parameter level.

So what you want to do is

&lt;T extends Dog&gt; void printExtends_compile_error( List&lt;T&gt; t) {

}

However super may not be used as type parameter, but only as wildcard. This means, that

&lt;T super Dog&gt; void printSuper_compile_error(List&lt;T&gt; t) {

}

will still be invalid.

huangapple
  • 本文由 发表于 2023年4月17日 02:22:26
  • 转载请务必保留本文链接:https://go.coder-hub.com/76029584.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定