相关疑难解决方法(0)

具有多个类的Java泛型通配符

我想要一个Class对象,但我想强制它所代表的任何类来扩展A类并实现接口B.

我可以:

Class<? extends ClassA>
Run Code Online (Sandbox Code Playgroud)

要么:

Class<? extends InterfaceB>
Run Code Online (Sandbox Code Playgroud)

但我不能两者兼顾.有没有办法做到这一点?

java generics class bounded-wildcard

369
推荐指数
2
解决办法
14万
查看次数

为什么我不能在具有多个边界的类型参数中使用类型参数?

所以,我的理解以下不工作,但为什么不工作?

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 generics constraints

51
推荐指数
3
解决办法
1万
查看次数

<T extends Object&E> vs <T extends E>

java.util.Collections.max的签名如下所示:

public static <T extends Object&Comparable <?super T >> T max(Collection collection);

根据我的理解,它基本上意味着T必须是 java.lang.Objectjava.lang.Comparable <?超级T >>,

但是,由于每个java.lang.Comparable也是一个java.lang.Object,上面的签名和下面的签名有什么区别?:

public static <T extends Comparable <?super T >> T max(Collection collection);

java generics

29
推荐指数
1
解决办法
4471
查看次数

你能指定一个泛型类型,它继承另一个泛型类型_and_具体的接口吗?

我有一个域模型系列,每个模型都有一个扩展它的子类实现一个特定的接口,就像这样(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)

java generics

15
推荐指数
1
解决办法
740
查看次数

在Java中扩展T和SomeInterface <T>

我想创建一个带有两个参数的类.一个应该简单地输入为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++做到这一点......?

java generics extends multiple-inheritance

8
推荐指数
1
解决办法
1465
查看次数

泛型Puzzler

我试图弄清楚如何让泛型跳过篮球.

我有:

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)

我要的是声明一个类有两个类型参数TS,在T被束缚TypeS被束缚TMiddle.

我无法看到泛型的方法来确保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)

但当然两者都不合法.也许有一些我不知道的魔法?

java generics nested-generics

8
推荐指数
1
解决办法
172
查看次数

使用下限通配符(Java)的"意外令牌"

我有类似的东西:

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正在报道:

  1. 错误:(46,18)java:>预期
  2. 错误:(46,19)java:非法启动类型
  3. 错误:(46,26)java:'('预期
  4. 错误:(46,28)java:<identifier>预期
  5. 错误:(46,29)java:'l'预计
  6. 错误:(46,43)java:<identifier>预期

有什么问题?我不允许将名字绑定到下限吗?或者我只允许R&X在上限中使用表达式?

把它改成

interface Foo<T> {
    //... lines [0,45]...

/*line 46*/ <R> List<? super T&R> weave(R value);
    //...
}
Run Code Online (Sandbox Code Playgroud)

产量

  1. 错误(46,31)java:>预期
  2. 错误(46,32)java:'('预期
  3. 错误(46,33)java:非法启动类型

java generics syntax-error bounded-wildcard

5
推荐指数
1
解决办法
994
查看次数