所以,我的理解是以下不工作,但为什么不工作?
interface Adapter<E> {}
class Adaptulator<I> {
<E, A extends I & Adapter<E>> void add(Class<E> extl, Class<A> intl) {
addAdapterFactory(new AdapterFactory<E, A>(extl, intl));
}
}
Run Code Online (Sandbox Code Playgroud)
该add()方法给出了一个编译错误,"当第一个绑定是一个类型参数时,无法指定任何其他绑定的适配器<E>"(在Eclipse中),或者"类型参数不能跟随其他边界"(在IDEA中),请选择.
很明显,你只是不允许在I那之前使用type参数&,那就是那个.(而且在你问之前,如果你改变它们就行不通,因为不能保证它I不是一个具体的类.)但为什么不呢?我查看了Angelika Langer的常见问题解答并找不到答案.
通常,当某些泛型限制看似随意时,这是因为您创建了一种类型系统无法实际执行正确性的情况.但我不知道哪种情况会破坏我在这里要做的事情.我可能会说它可能与类型擦除后的方法调度有关,但是只有一种add()方法,所以它不像是有任何歧义......
有人能为我证明这个问题吗?
我最近看到可以声明一个也受接口限制的返回类型.考虑以下类和接口:
public class Foo {
public String getFoo() { ... }
}
public interface Bar {
public void setBar(String bar);
}
Run Code Online (Sandbox Code Playgroud)
我可以声明一个这样的返回类型:
public class FooBar {
public static <T extends Foo & Bar> T getFooBar() {
//some implementation that returns a Foo object,
//which is forced to implement Bar
}
}
Run Code Online (Sandbox Code Playgroud)
如果我调用该方法从什么地方,我的IDE告诉我,在返回类型的方法String getFoo(),以及setBar(String),但只有当我点了后面的点功能如下:
FooBar.getFooBar(). // here the IDE is showing the available methods.
Run Code Online (Sandbox Code Playgroud)
有没有办法获得对这样一个对象的引用?我的意思是,如果我做这样的事情:
//bar only has the method setBar(String)
Bar bar = FooBar.getFooBar(); …Run Code Online (Sandbox Code Playgroud)