Walter Laan created COLLECTIONS-747:
---------------------------------------

             Summary: MultiKey.getKeys class cast exception
                 Key: COLLECTIONS-747
                 URL: https://issues.apache.org/jira/browse/COLLECTIONS-747
             Project: Commons Collections
          Issue Type: Bug
          Components: KeyValue
    Affects Versions: 4.4
            Reporter: Walter Laan


When using an non-array constructor of MultiKey, an Object[] is created, which 
cannot be cast to a K[]
{code}
import org.apache.commons.collections4.keyvalue.MultiKey;

public class MultiKeyClassCastException {

    public static void main(String[] args) {
        MultiKeyClassCastException key1 = new MultiKeyClassCastException();
        MultiKeyClassCastException key2 = new MultiKeyClassCastException();
        MultiKeyClassCastException[] keys = new MultiKey<>(key1, 
key2).getKeys();
    }
}

// running gives (same error if in module):

Exception in thread "main" java.lang.ClassCastException: class 
[Ljava.lang.Object; cannot be cast to class [LMultiKeyClassCastException; 
([Ljava.lang.Object; is in module java.base of loader 'bootstrap'; 
[LMultiKeyClassCastException; is in unnamed module of loader 'app')
        at MultiKeyClassCastException.main(MultiKeyClassCastException.java:8)
{code}

AFAIK, the only way to fix this (with source compatibility), is to only have a 
varargs constructors. but I think this breaks binary compatibility though and 
cannot be used with the existing constructors.
{code}
    @SafeVarargs
    public MultiKey(K... keys) {
        this.keys = keys;
    }
{code}

Workaround is to use array constructor with correct typed array or 
{code}Object[] keys = multiKey.getKeys();{code} explicitly.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to