Non è possibile.
Oppure, in altre, qualsiasi matrice e qualsiasi riferimento già soddisfare la vostra esigenza, "matrice di tipo x e un altro varable con lo stesso tipo matrice", perché qualsiasi array è un "array di digitare Object
"e qualsiasi riferimento dello stesso tipo (Object
).
Quello che si desidera serve no tipo sicurezza scopo. Considera, ipoteticamente, che ci fosse un linguaggio per fare ciò che vuoi. Può operare solo sui tipi in fase di compilazione delle espressioni degli argomenti. Ma qualcuno può sempre fare questo:
Object[] foo = anyArrayExpression;
Object bar = anyReferenceExpression;
arrayContains(foo, bar);
o
arrayContains((Object[])anyArrayExpression, (Object)anyReferenceExpression);
(e, tra l'altro, nessuno di questi stanno facendo nulla di sospetto o pericoloso Un upcast è sempre sicuro al 100% e il funzionamento legit in. Java.)
Quindi qualsiasi array e qualsiasi riferimento possono sempre essere passati alla tua funzione in ogni caso, e la tua funzione deve sempre gestire gli oggetti reali essendo qualsiasi tipo di array e qualsiasi oggetto di tipo comunque. Quindi la tua funzione non ottiene nulla.
Anche se limitate per essere sottotipi di un certo tipo X
, e la vostra funzione richiede solo X[]
e X
, può ancora essere sempre il caso che il classe di runtime effettivo degli oggetti puntato da riferimenti passati in sono Y[]
e Z
, dove Y
e Z
sono sottotipi non collegati di X
. Questo è solo un fatto di come funziona il sistema di tipi Java. Quindi la tua funzione avrà sempre a che fare con il tipo di componente runtime dell'array potenzialmente non correlato alla classe runtime dell'altro oggetto, indipendentemente da come lo fai. (L'unica eccezione sarebbe se X
fosse finale, quindi non ha sottoclassi, ma la restrizione sarebbe priva di significato perché sarebbe banalmente sempre vera)
Che dire di 'arrayContains (T object, T [] array)'? – JimmyB
Il problema è che nel tuo caso 'T' diventa' Oggetto'. Non vedere alcuna soluzione tranne il tipo esplicitamente specializzato. – talex
In questo caso, 'arrayContains', non ha molta importanza. Resterà semplicemente falso, perché un 'String []' non può contenere un 'Pig'. Ma comunque, è un 'Oggetto' in quel caso, come indicato sopra. – Bubletan