2013-02-26 35 views
3

所以我刚刚得知,我可以会员类型具有多个限制

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

在Java中表达foo延伸SomeClass,也实现了SomeInterface<OtherClass>。到现在为止还挺好。

但是如何将foodoSomething()赋值给一个成员变量?课程的课程不知道任何与doSomething()方法相关的类型定义。

我需要的上下文是一个POJO,它的构造函数需要与上述T进行争论,并且需要再次返回上述T

我来最接近的是以下几点:

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; 
    } 
} 

但我不能左右风我的头得到没有取消选中投的解决方案。

+1

@giorashc:他的构造函数很好:泛型类型,类名,参数。 – jlordo 2013-02-26 15:19:16

+0

ohhh对不起我的错误... – giorashc 2013-02-26 15:23:23

回答

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(); 
+0

我想避免这种情况,因为ThisClass实际上是一个再次被重新实现的抽象类,我必须在每个派生类中携带冗长的'U extends SomeClass&SomeInterface ' ,只是另一个'AnotherClass'参数。但我想,这是做到这一点的唯一方法......? – 2013-02-26 15:30:51

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(); 

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