Просто чтобы прояснить, потому что вопрос «внутри определенного набора полей / div»:
var somethingChanged = false;
$(document).ready(function() {
$('fieldset > input').change(function() {
somethingChanged = true;
});
});
или
var somethingChanged = false;
$(document).ready(function() {
$('div > input').change(function() {
somethingChanged = true;
});
});
Я использовал решение, аналогичное тому, что он объясняет здесь, для нескольких проектов и нашел его довольно полезным.
http://blog.xebia.com/2009/02/07 / acessing-generic-types-at-runtime-in-java /
В jist используется следующее:
public Class returnedClass() {
ParameterizedType parameterizedType = (ParameterizedType)getClass()
.getGenericSuperclass();
return (Class) parameterizedType.getActualTypeArguments()[0];
}
В отличие от .NET обобщенные шаблоны Java реализуются с помощью метода, называемого «стирание типа».
Это означает, что компилятор будет использовать информацию о типе при создании файлов классов, но не передавать эту информацию в байтовый код. Если вы посмотрите на скомпилированные классы с помощью javap или аналогичных инструментов, вы обнаружите, что List
представляет собой простой List
(из Object
) в class, так же, как это было в коде до Java-5.
Код, обращающийся к общему списку, будет «переписан» компилятором, чтобы включить приведение типов, которые вам пришлось бы написать самостоятельно в более ранних версиях. Фактически, следующие два фрагмента кода идентичны с точки зрения байтового кода после того, как компилятор завершит работу с ними:
Java 5:
List<String> stringList = new ArrayList<String>();
stringList.add("Hello World");
String hw = stringList.get(0);
Java 1.4 и более ранние версии:
List stringList = new ArrayList();
stringList.add("Hello World");
String hw = (String)stringList.get(0);
При чтении значений из универсального класса в Java 5 необходимое приведение к параметру объявленного типа автоматически вставляется. При вставке компилятор проверит значение, которое вы пытаетесь ввести, и прервет работу с ошибкой, если это не строка.
Все это было сделано для того, чтобы старые библиотеки и новый обобщенный код оставались совместимыми без необходимости перекомпилировать существующие библиотеки. Это главное преимущество по сравнению с .NET, когда общие классы и неуниверсальные классы живут бок о бок, но не могут свободно заменяться.
Оба подхода имеют свои плюсы и минусы, но именно так обстоит дело в Java.
Возвращаясь к исходному вопросу: вы не сможете получить информацию о типе во время выполнения, потому что ее просто больше нет, как только компилятор выполнит свою работу. Это, безусловно, в некотором смысле ограничивает, и есть несколько причудливых способов обойти это, которые обычно основаны на хранении где-то экземпляра класса, но это не стандартная функция.
Из-за стирания типа нет способа сделать это напрямую. Однако вы могли бы передать Class
в конструктор и сохранить его внутри своего класса. Затем вы можете сравнить его с тремя возможными типами Class
, которые вы разрешаете.
Однако, если есть только три возможных типа, вы можете вместо этого рассмотреть возможность рефакторинга в перечисление .
The whole point of a generic class is that you dont need to know the type that is being used....
The Problem is that most of the Generic stuff will disappear during compilation.
One common solution is to save the type during the creation of the Object.
For a short introduction in the Type Erasure behaviour of java read this page
Похоже, вам нужен не общий класс, а интерфейс с множеством различных реализаций. Но, может быть, станет понятнее, если вы обозначите свою актуальную, конкретную цель.
I agree with Visage. Generics is for compile-time validation, not runtime dynamic typing. Sounds like what you need is really just the factory pattern. But if your "do this" isn't instantiation, then a simple Enum will probably work just as well. Like what Michael said, if you have a slightly more concrete example, you'll get better answers.