鉴于这两个类:
BeanTestA.java
import java.util.LinkedList;
import java.util.List;
public abstract class BeanTestA<E>
{
protected final List<E> list = new LinkedList<>();
public abstract E getDelegateAt( int idx );
public void setDelegateAt( int idx, E e )
{
list.set( idx, e );
}
public void removeDelegateAt( int idx )
{
list.remove( idx );
}
}
BeanTestB.java:
import java.util.LinkedList;
public class BeanTest
extends BeanTestA<LinkedList>
{
@Override
public LinkedList getDelegateAt( int idx )
{
return list.get( idx );
}
@Override
public void setDelegateAt( int idx, LinkedList v )
{
super.setDelegateAt( idx, v );
}
@Override
public void removeDelegateAt( final int idx )
{
super.removeDelegateAt( idx );
}
}
如果我跑:
java.beans.Introspector.getBeanInfo( BeanTest.class );
我收到错误:
java.beans.IntrospectionException: type mismatch between indexed read and indexed write methods: delegateAt
因为在某些时候它使用BeanTest.getDelegateAt和BeanTestA.setDelegateAt的参数调用java.beans.IndexedPropertyDescriptor.findIndexedPropertyType(Method,Method)。 findIndexedPropertyType从BeanTest.getDelegateAt的返回类型获取indexedPropertyType,因为擦除而是Object。但随后它将LinkedList作为参数,并抛出IntrospectionException。
这是java.beans.Introspector中的错误,还是这种带有泛型的索引bean模式不受支持?
这是OpenJDK 1.7.0_25(来自Debian sid)和Oracle JDK 1.7.0_45(来自oracle.com)。