Если вас беспокоит ограничение типа T extends Box<T>
, это означает, что только типы, которые могут быть указаны в качестве параметра типа, должны расширяться Box
.
Этот метод используется для указания дополнительных операций, которые вы можете выполнять с вашим типом (например, хорошо известным Comparable<T>
), так что на самом деле использование класса, а не интерфейса не очень распространено.
Позвольте привести пример. Скажем, у нас есть следующие операции
interface Op1<T>{
void doOp1(t: T): T
}
interface Op2<T> {
void doOp2(t: T): T
}
class MyClass implements Op1<MyClass>, Op2<MyClass>{
//By implementing Op1 and Op2 you
//specify that operations doOp1 and doOp2
// can be applied to variable of typr MyClass
}
И теперь вы хотите реализовать свой универсальный контейнер, который принимает элементы типов Op1
и Op2
, которые могут быть применены к
class MyContainer<T extends Op1<T> & Op2<T>>{
//you can apply doOp1 and doOp2 to any variable of the type T
}
MyContainer<MyClass> t = //... Ok
MyContainer<Integer> t = //... Not ok
[1111 ] В функциональном программировании подобное (но не совсем то же самое) называется классом типов
Вы можете переопределить имя приложения в конфигурации следующим образом ...
<elmah>
<errorLog type="..." applicationName="YourApplicationName" />
</elmah>
Вы можете просто дать своему приложению просмотра существующее имя приложения, которое вы хотите отслеживать, или указать одно и то же имя в обоих файлах конфигурации.