3

所以我才知道我可以

public <T extends SomeClass & SomeInterface<OtherClass>> doSomething(T foo);

在 Java 中表示foo扩展SomeClass并实现SomeInterface<OtherClass>. 到目前为止,一切都很好。

但是我将如何分配foodoSomething()成员变量?该类当然不知道附加到该doSomething()方法的任何类型定义。

我需要 this 的上下文是一个 POJO,它的构造函数需要用 said 进行参数T化,并且需要T再次返回 said。

我最接近的是以下内容:

public class ThisClass implements AnotherInterface<AnotherClass> {

    private final Object obj;

    public <U extends SomeClass & SomeInterface<AnotherClass>> ThisClass(U obj) {
        this.obj = obj;
    }

    public <U extends SomeClass & SomeInterface<AnotherClass>> U getObject() {
        return (U) obj;
    }
}

但是如果没有未经检查的演员表,我无法绕开脑袋来找到解决方案。

4

2 回答 2

1

你不能让这个类通用:

public class ThisClass<U extends SomeClass & SomeInterface<AnotherClass>>
                                   implements AnotherInterface<AnotherClass> {

    private final U obj;

    public ThisClass(U obj) {
        this.obj = obj;
    }

    public U getObject() {
        return obj;
    }
}

并像这样使用它:

ThisClass<String> instance = new ThisClass<>("Foo");
String value = instance.getObject();
于 2013-02-26T15:14:37.447 回答
0

不幸的是,它无法完成。问题是 Java 没有可表示的拦截类型A&B

如果 Java 有这个,我们可以写类似的东西

    Pet&Furry pet;

    void set(Pet&Furry pet){ this.pet=pet; }

    Pet&Furry get(){ return pet; }

现在,类型变量可以有拦截边界A&B,所以有人会认为我们可以利用它

    Object pet;

    <U extends Pet&Furry> void set(U pet){ this.pet=pet; }

    <U extends Pet&Furry> U get(){ return (U)pet; }

但它不是类型安全的。考虑

    x.set(dog); 
    ...
    Cat cat = x.get();

如果我们要求程序员在精神上跟踪实际类型,我们可能会承受这种风险。

于 2013-02-26T16:50:01.543 回答