2014-10-18 2 views
0

Я хочу написать метод, который принимает в качестве параметра либо результат вызова Lambdaj.on(), либо строку.Есть ли способ определить во время выполнения, если объект был создан с использованием метода Lambdaj.on()?

public static <T> void method(T arg) { 
} 

T может быть строкой здесь. Можно ли определить, был ли arg создан с использованием метода Lambdaj.on()?

+0

Верно ли 'Lambdaj.on' String? Если нет, и '! (Arg instanceof String)', то он исходит из 'Lambdaj.on' (или имеет значение null). –

+0

Да, 'Lambdaj.on' может возвращать любой тип. Это действительно здорово, потому что вы можете писать 'on (SomeClass.class) .getX(). GetY()' – alkedr

+0

Тогда вы не можете, потому что, если вы получите String, это может быть строка, переданная пользователем напрямую или строка возвращенный 'getY()', и вся информация об источнике была потеряна. (С другой стороны, если 'getY' фактически возвращает тип, который подклассифицирует String и добавляет некоторые интерфейсы, вы можете проверить наличие этих интерфейсов. Это кажется невозможным без модифицированной JVM, однако, поскольку String является окончательной.) –

ответ

0

После прочтения исходного кода Lambdaj (ArgumentsFactory.java по большей части) я могу заключить, что это невозможно.

Lambdaj хранит данные в WeakHashMap<Object, Argument<?>>, где ключ - это то, что возвращает такие вещи, как on(SomeCLass.classs).getX(). WeakHashMap сравнивает объекты с использованием .hashCode() и .equals().

Смежные вопросы