编程语言
首页 > 编程语言> > 泛型和varargs java

泛型和varargs java

作者:互联网

以下是我的设置

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

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

解决方法:

好的..问题在于您现有代码的设计(您无法更改).具有公共接口Test< T extends MyInterface>然后公共类TestImpl实现Test< MyInterfaceImpl>是错的.

TestImpl使用MyInterfaceImpl实现Test,而原始的Test接口只需要一个扩展MyInterface而不实现它的对象.

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

test.someMethod(new MyInterfaceImpl()); 

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

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

方法someMethod(MyInterface …)属于原始类型Test.对泛型类型Test< T>的引用.应该参数化.

这意味着您应该测试< MyInterfaceImpl>测试以避免仅使用new运算符获得此错误.

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

上面的代码没有问题.

标签:java,interface,generics,variadic-functions
来源: https://codeday.me/bug/20190830/1768922.html