我想要一个Class对象,但我想强制它所代表的任何类来扩展A类并实现接口B.
我可以:
Class<? extends ClassA>
Run Code Online (Sandbox Code Playgroud)
要么:
Class<? extends InterfaceB>
Run Code Online (Sandbox Code Playgroud)
但我不能两者兼顾.有没有办法做到这一点?
所以,我的理解是以下不工作,但为什么不工作?
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()方法,所以它不像是有任何歧义......
有人能为我证明这个问题吗?
java.util.Collections.max的签名如下所示:
public static <T extends Object&Comparable <?super T >> T max(Collection collection);
根据我的理解,它基本上意味着T必须是 java.lang.Object和java.lang.Comparable <?超级T >>,
但是,由于每个java.lang.Comparable也是一个java.lang.Object,上面的签名和下面的签名有什么区别?:
public static <T extends Comparable <?super T >> T max(Collection collection);
我有一个域模型系列,每个模型都有一个扩展它的子类并实现一个特定的接口,就像这样(Cloneable不是有问题的接口,仅用于示例目的):
class A{}
class B extends A implements Cloneable{}
class C{}
class D extends C implements Cloneable{}
Run Code Online (Sandbox Code Playgroud)
我想创建一个通用类型签名来强制执行此配对,我试过这个失败:
<T1,T2 extends T1 & Cloneable> void f ( T1 t1, T2 t2 ){}
Run Code Online (Sandbox Code Playgroud)
但我在IntelliJ IDE中收到消息"Type parameter cannot be followed by other bounds"; 如果我将订单切换到以下情况,它仍然会失败:
<T1,T2 extends Cloneable & T1> void f ( T1 t1, T2 t2 ){}
Run Code Online (Sandbox Code Playgroud)
我收到了消息 "Interface expected here."
令人困惑的是,这两个签名WORK:
<T extends A & Cloneable> void f( A a, …Run Code Online (Sandbox Code Playgroud) 我想创建一个带有两个参数的类.一个应该简单地输入为T.另一个应该被输入为扩展T和T的东西SomeInterface<T>.当我尝试这个时
public class SomeClass<T, S extends SomeInterface<T> & T>
Run Code Online (Sandbox Code Playgroud)
然后Java抱怨
"类型T不是接口;它不能被指定为有界参数"
如果相反,我试图为S创建一个接口
public interface TandSomeInterface<T> extends SomeInterface<T>, T
Run Code Online (Sandbox Code Playgroud)
然后Java抱怨
"不能将类型参数T称为超类型"
有没有办法在Java中这样做?我想你可以用C++做到这一点......?
我试图弄清楚如何让泛型跳过篮球.
我有:
interface Root { }
interface Middle extends Root { }
class Type implements Root { }
Run Code Online (Sandbox Code Playgroud)
还有很多"Subtype"类:
class Subtype1 extends Type implements Middle { }
class Subtype2 extends Type implements Middle { }
...
Run Code Online (Sandbox Code Playgroud)
我要的是声明一个类有两个类型参数T和S,在T被束缚Type和S被束缚T和Middle.
我无法看到泛型的方法来确保S扩展T和实现Middle.我想要的是:
class Handler<T extends Root, S extends T, S extends Middle>;
Run Code Online (Sandbox Code Playgroud)
要么
class Handler<T extends Root, S extends <T extends Middle>>;
Run Code Online (Sandbox Code Playgroud)
但当然两者都不合法.也许有一些我不知道的魔法?
我有类似的东西:
interface Foo<T> {
//... lines [0,45]...
/*line 46*/ <R, X super T&R> List<X> weave(R value);
//...
}
Run Code Online (Sandbox Code Playgroud)
但是IntelliJ正在报道:
有什么问题?我不允许将名字绑定到下限吗?或者我只允许R&X在上限中使用表达式?
把它改成
interface Foo<T> {
//... lines [0,45]...
/*line 46*/ <R> List<? super T&R> weave(R value);
//...
}
Run Code Online (Sandbox Code Playgroud)
产量