致力于满足特定需求。大多数在线教程都讨论了如何将通配符实现应用于集合。在下面的例子中,extends工作正常但是当我使用通配符边界获取错误时应用super。我想用超级类型限制一个方法,如下例所示。我应该知道的超级有限制吗?
class SuperClass3 {
public void display() {
System.out.println("This is display3 method");
}
}
class SuperClass2 extends SuperClass3 {
public void display() {
System.out.println("This is display2 method");
}
}
class SuperClass1 extends SuperClass2 {
public void display() {
System.out.println("This is display1 method");
}
}
扩展效果很好(类型边界不带通配符边界)...
public <T extends SuperClass2> void displayOutput(T obj) {
obj.display();
}
尝试对超级不工作做同样的事情。在方法签名上抛出编译错误。
public <T super SuperClass2> void displayOutputWithSuper(T obj) {
//obj.display();
}
Complete Example ...
package com.tutorial.generic.bounds.wildcard;
import java.util.List;
public class UpperBoundWildcardExample {
class SuperClass3 {
public void display() {
System.out.println("This is display3 method");
}
}
class SuperClass2 extends SuperClass3 {
public void display() {
System.out.println("This is display2 method");
}
}
class SuperClass1 extends SuperClass2 {
public void display() {
System.out.println("This is display1 method");
}
}
public <T extends SuperClass2> void displayOutput(T obj) {
obj.display();
}
public void addData(List<? extends SuperClass2> data) {
}
public <T super SuperClass1> void displayOutputWithSuper(T obj) {
obj.toString();
}
/*
* This wont work
*
* public void addData(<? extends SuperClass2> data){
*
* }
*/
public static void main(String[] args) {
UpperBoundWildcardExample obj = new UpperBoundWildcardExample();
// Oops!!! Error
// obj.displayOutput(obj.new SuperClass3());
// It suppports SuperClass2 & which extends SuperClass2
obj.displayOutput(obj.new SuperClass2());
obj.displayOutput(obj.new SuperClass1());
}
}
答案 0 :(得分:0)
@Shaan 这可能会有所帮助
Bounding generics with 'super' keyword
让我们说你有这个通用的方法声明:
<T super Integer> void add(T number) // hypothetical! currently illegal in Java
你有这些变量声明:
Integer anInteger
Number aNumber
Object anObject
String aString
你的意图(如果它是合法的)是它应该允许add(anInteger)和add(aNumber),当然还有add(anObject),但不能添加(aString)。好吧,String是一个Object,所以add(aString)仍然会编译。