泛型和varargs java

时间:2014-08-21 17:41:00

标签: java generics interface variadic-functions

以下是我的设置

public interface Test<T extends MyInterface> 
{
    someMethod(T... a)
}

public class TestImpl implements Test<MyInterfaceImpl> 
{
    someMethod(MyInterfaceImpl... a)
}

public class MyInterfaceImpl implements MyInterface {}

public someClass { @Autowired TestFactory testfactory 

......

// getting an error --  Type mismatch Can't assign non-array value to an array 
testfactory.getTest(Type type).someMethod(new MyInterfaceImpl()) 

}

public class TestFactoryImpl implements TestFactory { Test getTest(Type type) { return registry.get(type)}}

反过来导致java.lang.ClassCastException:[Lcom.test.MyInterface;无法转换为[Lcom.test.Impl.MyInterfaceImpl;

但下面的作品

testfactory.getTest(Type type).someMethod(new MyInterfaceImpl[]{new MyInterfaceImpl()}) 

不确定发生了什么。请帮忙

2 个答案:

答案 0 :(得分:5)

好的..问题在于您现有代码的设计(您无法改变)。 public interface Test<T extends MyInterface>然后public class TestImpl implements Test<MyInterfaceImpl>是错误的。

TestImpl正在使用Test实施MyInterfaceImpl,而原始Test接口只需要extends MyInterface并且不实现该对象的对象。

执行代码时,运行时会出现类型混淆。以下行不仅会抛出ClassCastException

test.someMethod(new MyInterfaceImpl()); 

test.someMethod();本身也会引发异常。所以,让我们说如果你工厂调用这个方法不传递任何参数,你仍然会得到一个例外,因为原设计是有缺陷的。在正常情况下,test.someMethod();不应该抛出异常。您需要与相关方联系,以解决此严重问题。

以下是一个示例解决方案:

方法someMethod(MyInterface...)属于原始类型Test。应该参考通用类型Test<T>的参考。

这意味着您应Test<MyInterfaceImpl> test以避免仅与new运算符一起出现此错误。

Test<MyInterfaceImpl> test
...
test.someMethod(new MyInterfaceImpl()); 

上面的代码没问题。

答案 1 :(得分:0)

更好的解决方案是在TestImpl课程中执行以下操作

public class TestImpl implements Test<MyInterface>{...}

而不是

public class TestImpl implements Test<MyInterfaceImpl>{...}

这样你就不需要显式地参数化你的对象实例(即你可以做到

Test test
...
test.someMethod(new MyInterfaceImpl());