协变返回或通用

时间:2013-12-06 09:02:01

标签: java inheritance casting covariance

我希望在接口中有一个方法,它返回一个类,该类的类型未在包中定义。然后,实现类将返回特定类型。我可以看到至少3种方法,如下所示:fn1fn2fn3。在所有情况下都有某种形式的未经检查的演员。这些方法中的任何一种都是首选还是有更好的东西? (假设接口I1和方法dostuff在其他jar包中,并且无法访问TestInteger

public class Myclass {

    public interface I1
    {
        Object fn1();
        <T> T fn2();
        <T> T fn3();
    }

    public class Test implements I1
    {

        @Override
        public Integer fn1() {
            return new Integer(1);
        }

        @Override
        public <T> T fn2() {
            return (T) new Integer(2); //requires cast to T
        }

        @Override
        public Integer fn3() { //automatic unchecked conversion to T in return value
            return new Integer(3);
        }       
    }

    public static void main(String[] args) {
        Myclass c = new Myclass();      
        I1 t = c.new Test();
        Integer i = (Integer) t.fn1(); //cast required here since I1.fn1() returns Object
        Integer j = t.fn2();
        Integer k = t.fn3();
        dostuff(t);

    }

    static void dostuff(I1 p)
    {
        Object i = p.fn1();
        Object j = p.fn2();
        Object k = p.fn3();
    }

}

2 个答案:

答案 0 :(得分:4)

你不能在界面上使用泛型吗?像

public interface I1<T> {

    T fn1();
    // etc

}

当你引用T时,不需要施法。

这至少是我喜欢的。您当然也可以指定您想要使用的内容

<T extends myInterface>

答案 1 :(得分:1)

我会这样做

public interface I1<T> {
    T fn1();
}

public class Test implements I1<Integer> {
    @Override
    public Integer fn1() {
        return new Integer(1);
    }
}

public static void main(String[] args) {
    Myclass c = new Myclass();
    I1<Integer> t = c.new Test();
    Integer i = t.fn1();  <-- no cast
}