我希望在接口中有一个方法,它返回一个类,该类的类型未在包中定义。然后,实现类将返回特定类型。我可以看到至少3种方法,如下所示:fn1
,fn2
和fn3
。在所有情况下都有某种形式的未经检查的演员。这些方法中的任何一种都是首选还是有更好的东西? (假设接口I1
和方法dostuff
在其他jar包中,并且无法访问Test
或Integer
类
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();
}
}
答案 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
}