Получение T.class несмотря на стирание типа Java

Я пытаюсь связать интерфейс с его реализацией, как считано из конфигурационного файла так, чтобы я мог подать его к своему контейнеру МОК. Вот примерно, что я пытаюсь сделать:

public class PropertyImplementationBinder<T> {
    // ...
    public Class getInterfaceClass() {
        return T.class; // OR Class<T>, note T is not newable
    }
    public Class getImplementationClass() {
        return /* read config file to get implementation class */;
    }
}

Так или иначе возможно добраться T.class?

18
задан Kaleb Pederson 9 February 2010 в 00:47
поделиться

3 ответа

Необходимо явно передать класс в конструктор (и сохранить его самостоятельно).

private final Class<T> clazz;

PropertyImplementationBinder(Class<T> clazz){
    this.clazz = clazz;
}

public Class<T> getInterfaceClass() {
    return clazz;
}
30
ответ дан 30 November 2019 в 06:50
поделиться

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

Оказывается, что в то время как JVM не отслеживает фактические аргументы типов для экземпляров общего класса, он отслеживает фактические аргументы типов для подклассов общих классов. Другими словами, в то время как новый ArrayList() на самом деле является просто новым ArrayList() во время выполнения, если класс расширяет ArrayList, то JVM знает, что String является фактическим аргументом типа для параметра типа List.

9
ответ дан 30 November 2019 в 06:50
поделиться

Вы могли сделать это 2 способами:

  1. добавляют, что ИМЯ приписывает всем вашим специальным узлам, таким образом, вы можете использовать, условия E4X ( xml)
  2. используют петлю, чтобы пройти специальные узлы и проверку, если есть на самом деле признак ИМЕНИ ( xml2)

, Вот пример:

//xml with all special nodes having NAME attribute
var xml:XML = <node>
 <node>
      <node>
        <special NAME="thisone"></special>
      </node>
      <node>
        <special NAME="something else">dont want this one</special>
      </node>
     </node>
</node>
//xml with some special nodes having NAME attribute
var xml2:XML = <node>
 <node>
      <node>
        <special NAME="thisone"></special>
      </node>
      <node>
        <special>dont want this one</special>
      </node>
     </node>
</node>

//WITH 4XL conditional
var filteredNodes:XMLList = xml.node.node.special.(@NAME == 'thisone');
trace("E4X conditional: " + filteredNodes.toXMLString());//carefull, it traces 1 xml, not a list, because there only 1 result,otherwise should return 
//getting the parent of the matching special node(s)
for each(var filteredNode:XML in filteredNodes)
    trace('special node\'s parent is: \n|XML BEGIN|' + filteredNode.parent()+'\n|XML END|');

//WITHOUGH E4X conditional
for each(var special:XML in xml2.node.node.*){
    if(special.@NAME.length()){
        if(special.@NAME == 'thisone')  trace('for each loop: ' + special.toXMLString() + ' \n parent is: \n|XML BEGIN|\n' + special.parent()+'\n|XML END|');
    }
}

есть довольно хорошее и легкое, чтобы следовать статье о E4X на страница Flash-разработчика Yahoo.

-121--3119841-

При использовании в скалярном контексте список вычисляется количеством предметов в нем:

my @list = ('a', 'b', 'c');
my $list_size = @list;

Для выполнения явного теста, например, в условии if:

my @list = ('a', 'b', 'c');
if (scalar @list == 3) {
  print "@list"; # prints list separated with spaces
}

Это также будет работать без ключевого слова «scalar». Однако это может затруднить сканирование кода. Контекст - замечательная идея, но она требует от читателя большего объема работы. Использование скаляра в явном виде позволяет читателю сразу увидеть, что выполняется вычисление @ перечислять в скалярном контексте.

-121--3832399-

Невозможно.

Единственным исключением стирания типа Java является то, что с помощью отражения можно определить параметризованный тип с помощью отражения на полях класса.

-1
ответ дан 30 November 2019 в 06:50
поделиться
Другие вопросы по тегам:

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