英文:
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
Here's source:
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{}
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_error
和 printSuper_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
<T extends Dog> void printExtends_compile_error( List<T> t) {
}
However super
may not be used as type parameter, but only as wildcard. This means, that
<T super Dog> void printSuper_compile_error(List<T> t) {
}
will still be invalid.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论