Java универсальный класс - определяет тип

Просто чтобы прояснить, потому что вопрос «внутри определенного набора полей / 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; 
   }); 
});
49
задан Ben Lakey 16 June 2009 в 10:25
поделиться

7 ответов

Я использовал решение, аналогичное тому, что он объясняет здесь, для нескольких проектов и нашел его довольно полезным.

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];
}
58
ответ дан 7 November 2019 в 11:30
поделиться

В отличие от .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.

Возвращаясь к исходному вопросу: вы не сможете получить информацию о типе во время выполнения, потому что ее просто больше нет, как только компилятор выполнит свою работу. Это, безусловно, в некотором смысле ограничивает, и есть несколько причудливых способов обойти это, которые обычно основаны на хранении где-то экземпляра класса, но это не стандартная функция.

44
ответ дан 7 November 2019 в 11:30
поделиться

Из-за стирания типа нет способа сделать это напрямую. Однако вы могли бы передать Class в конструктор и сохранить его внутри своего класса. Затем вы можете сравнить его с тремя возможными типами Class , которые вы разрешаете.

Однако, если есть только три возможных типа, вы можете вместо этого рассмотреть возможность рефакторинга в перечисление .

12
ответ дан 7 November 2019 в 11:30
поделиться

The whole point of a generic class is that you dont need to know the type that is being used....

0
ответ дан 7 November 2019 в 11:30
поделиться

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

3
ответ дан 7 November 2019 в 11:30
поделиться

Похоже, вам нужен не общий класс, а интерфейс с множеством различных реализаций. Но, может быть, станет понятнее, если вы обозначите свою актуальную, конкретную цель.

0
ответ дан 7 November 2019 в 11:30
поделиться

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.

0
ответ дан 7 November 2019 в 11:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: