2016-03-09 76 views
1

如何在下面的代码中删除警告Unchecked overriding: return type requires unchecked conversion. Found 'org.example.AAndB<java.lang.integer>', required 'T'.类型参数范围 - 取消选中覆盖:返回类型需要非选中转换

我尝试这样一种方式,它不会明确说明方法get()AAndB<Integer>)的返回类型,而是枚举接口的结果必须实现(<T extends B<Integer> & A> T)来设计的接口(Interface)。

package org.example; 

class InterfaceImpl implements Interface { 

    public AAndB<Integer> get() { 
     // ^----- Unchecked overriding: return type requires unchecked conversion. Found 'org.example.AAndB<java.lang.integer>', required 'T'. 
     final AAndB<Integer> aAndB = new AAndB<Integer>(); 
     return aAndB; 
    } 
} 

interface Interface { 
    <T extends B<Integer> & A> T get(); 
} 

class AAndB<T> implements A, B<T> { 

    public void a() { 

    } 

    public void b(T t) { 

    } 
} 

interface A { 
    void a(); 
} 

interface B<T> { 
    void b(T t); 
} 
+0

我发现相关问题[如何引用具有多个边界的泛型返回类型](http://stackoverflow.com/questions/14464226/how-to-reference-a-generic-return-type-with-multiple-边界)与全面的[答案](http://stackoverflow.com/a/14469627/639687)。 – czerny

回答

1

我们可以清楚地看到,你实现的方法签名不通过方法定义的签名Interface匹配:

public AAndB<Integer> get() 

是不一样的

public <T extends B<Integer> & A> T get() 

T的定义是方法签名的一部分。为了符合Interface.get,你需要写:

class InterfaceImpl implements Interface { 
    public <T extends B<Integer> & A> T get() { 
     // ... 
    } 
} 

在接口中的方法签名界仿制药并不意味着可以替代任何类型的在于你自己的实现方法的范围内。

如果你希望能够指定不同的返回类型,需要进行参数Interface

class InterfaceImpl implements Interface<AAndB<Integer>> { 

    public AAndB<Integer> get() { 
     final AAndB<Integer> aAndB = new AAndB<Integer>(); 
     return aAndB; 
    } 
} 

interface Interface<T extends B<Integer> & A> { 
    T get(); 
} 
+0

请您详细说明为什么最初的'InterfaceImpl'实际上并没有实现'Interface'? – czerny

+0

更新了更多细节。 – VGR

0

你完全误解了什么<T extends B<Integer> & A> T get();手段。

<T extends B<Integer> & A> T get();声明了一个通用方法。这意味着该方法必须能够与任何T正确工作 - 它必须正确地与T正常工作,无论任何呼叫者可能需要T,无需知道什么是T

这并不意味着该方法可以选择T是它想要的。恰恰相反。该方法没有选择,并且必须与为其选择的任何T一起工作。