Я пытаюсь связать интерфейс с его реализацией, как считано из конфигурационного файла так, чтобы я мог подать его к своему контейнеру МОК. Вот примерно, что я пытаюсь сделать:
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
?
Необходимо явно передать класс в конструктор (и сохранить его самостоятельно).
private final Class<T> clazz;
PropertyImplementationBinder(Class<T> clazz){
this.clazz = clazz;
}
public Class<T> getInterfaceClass() {
return clazz;
}
Можно получить фактические аргументы типа для общего суперкласса класса. В этом посте блога исследуются возможности, предоставляемые этим, включая милую маленькую уловку, использующую тривиальные анонимные внутренние классы. Прямая цитата:
Оказывается, что в то время как JVM не отслеживает фактические аргументы типов для экземпляров общего класса, он отслеживает фактические аргументы типов для подклассов общих классов. Другими словами, в то время как
новый ArrayList
на самом деле является просто() новым ArrayList()
во время выполнения, если класс расширяетArrayList
, то JVM знает, чтоString
является фактическим аргументом типа для параметра типаList
.
Вы могли сделать это 2 способами:
, Вот пример:
//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 является то, что с помощью отражения можно определить параметризованный тип с помощью отражения на полях класса.