相关疑难解决方法(0)

Java泛型:有界类型参数中的多重继承<T扩展A&I>

我即将创建一个工厂,它创建某种类型的对象T,它扩展了某个类A和另一个接口I.但是,T必须是未知的.以下是最低声明:

public class A { }
public interface I { }
Run Code Online (Sandbox Code Playgroud)

这是工厂方法:

public class F {
    public static <T extends A & I> T newThing() { /*...*/ }
}
Run Code Online (Sandbox Code Playgroud)

这编译所有罚款.

当我尝试使用该方法时,以下工作正常:

A $a = F.newThing();
Run Code Online (Sandbox Code Playgroud)

......虽然这不是:

I $i = F.newThing();
Run Code Online (Sandbox Code Playgroud)

编译器抱怨:

绑定不匹配:类型F的泛型方法newThing()不适用于arguments().推断的类型I和A不是有界参数的有效替代

我不明白为什么.明确指出"newThing返回某种类型的东西T,它确实扩展了A类并实现了接口I".当分配给一个一切正常(因为T延伸的),但分配给我并没有(因为什么?,清楚地返回的东西既是一个一个I)

另外:当返回一个对象时,比如说类型B class B extends A implements I,我需要将它转换为返回类型T,尽管B匹配边界:

<T extends A & I> T newThing() {
    return (T) new B();
}
Run Code Online (Sandbox Code Playgroud)

但是,编译器不会抛出任何警告,如UncheckedCast等.

因此我的问题:

  • 这里出了什么问题?
  • 是否容易实现所需的行为(即分配给静态类型A或I的变量),就像在工厂方法中通过强制转换解决返回类型问题一样?
  • 为什么分配到A工作,而我不工作?

-

编辑:这里完整的代码片段完全使用Eclipse 3.7,项目设置为JDK 6: …

java generics types bounded-wildcard

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

强制泛型类型作为接口?

看起来这是不可能做到的,但有没有人能够巧妙地解决这个问题呢?

public class SomeClassIterableWrapper<S, T extends SomeClass & S> implements Iterable<S>
Run Code Online (Sandbox Code Playgroud)

哪里S应该是某种未知类型的接口,并且SomeClass是具有行索引的2D数组,其功能类似于双向JDBC结果集.子类SomeClass具有每列的自定义getter和setter.我希望能够像List一样迭代这个结构.我想在我SomeClass和Bean 之间实现一个通用接口,以便访问getter和setter.因此,S需要是那个界面.但是我提供的声明不起作用.有办法解决这个问题吗?

编辑以显示我想要的实现:

public class SomeClassIterableWrapper<S, T extends SomeClass & S> implements Iterable<S>{

T object;

public SomeClassWrapper(T object){
    this.object = object;
}

@Override
public Iterator<S> iterator() {
    object.setIndex(-1);
    return new SomeClassIterator<S>();
}

private class SomeClassIterator<S> implements Iterator<S> {

    @Override
    public boolean hasNext() {
        return object.index() < object.rowSize() - 1;
    }

    @Override
    public S next() {
        object.next();
        //safe because only interface methods …
Run Code Online (Sandbox Code Playgroud)

java generics

7
推荐指数
1
解决办法
1138
查看次数

如何创建实现两个公共接口的许多类的实例的集合/列表(不修改这些类)?

我有两个接口 ( IfaceA, IfaceB) 和两个实现这些接口的类 (class C, class D):

interface IfaceA {
    void doA();
}

interface IFaceB {
    void doB();
}

class C implements IfaceA, IFaceB {
    public void doA() {}
    public void doB() {}
}

class D implements IfaceA, IFaceB {
    public void doA() {}
    public void doB() {}
}
Run Code Online (Sandbox Code Playgroud)

我无法更改这些类的签名。

如何制作实现两个接口的类的实例列表或集合?

我试过的:

public static void main(String[] args) {

    List<? extends IfaceA & IFaceB> test_1;
    List<? extends IfaceA, IFaceB> test_2;

    Class<? extends IfaceA, IFaceB>[] test_3; …
Run Code Online (Sandbox Code Playgroud)

java inheritance

6
推荐指数
1
解决办法
96
查看次数

变量包含扩展Enum的类并实现接口

我想做这样的事情:

private Class<? extends Enum<?> implements IMultiBlockEnum> typeEnum;
Run Code Online (Sandbox Code Playgroud)

我该怎么办?"&"而不是"implements"不起作用,但Eclipse也没有给出正确的解释.

克里斯托弗克林格

java

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

标签 统计

java ×4

generics ×2

bounded-wildcard ×1

inheritance ×1

types ×1