Существует только один способ стереть универсальную оболочку, создать поле, в котором точно указано, какой тип должен быть внутри, очевидно, это подразумевает небольшое снижение производительности, но гарантирует безопасность типов. Стоит ли оно того? Вероятно, нет.
class AWrapper<T extends A> {
T a;
Class<? super T> tClass; //new
//Class<T> tClass; //or like this if exact match is needed
AWrapper(T a, Class<? super T> tClass) { //edited
//AWrapper(T a, Class<T> tClass) { //or like this if exact match is needed
if (a.getClass().isInstance(tClass)) { //new
//if (a.getClass().equals(tClass)){ //or like this if exact match is needed
throw new ClassCastException("Object being wrapped is not of good type, the cause and solution is simply a programmer declared this generic type of an uncompatible type, this exception is designed to reduce runtime ClassCastExceptions by throwing them not at compiletime(impossible) but as soon as possible"); //new
}
this.a = a;
this.tClass = tClass; //new
}
AWrapper(boolean b, Class<T> tClass) { //edited
this((T) findObjectStupid(b), tClass); //edited
}
public T getA() {
return a;
}
}
<T extends A> T findObjectStupid(boolean b) {
if (b) {
return (T) new B1();
} else {
return (T) new B2();
}
}
void main() {
AWrapper<B1> rightWrapper = new AWrapper<>(true, B1.class); //edited
AWrapper<B1> wrongWrapper = new AWrapper<>(false, B1.class); //edited, now this throws exception just like we hoped
B1 rightObject = rightWrapper.getA();
B1 wrongObject = wrongWrapper.getA(); //never gets here
}
В приведенном выше коде класс сохраняется, так что позже объект T можно переназначить, но если присвоение выполняется только один раз в конструкторе, тогда строка Class<? super T> tClass;
может быть полностью удалена. Удаляя эту строку, очевидно, все типы безопасности без снижения производительности (кроме фактического оператора if).
Поначалу это действительно легко спутать, но в конечном итоге достаточно просто. Мне понравилось это видеоурок UMBC equity по RDFa, который начинается с объяснения RDF, дает вам удобную для восприятия нотацию для справки (N3), а затем показывает, как поместить RDF в обычные веб-страницы с помощью атрибутов RDFa.
Я также начал публиковать свой собственный RDFa о музыкальных событиях и нашел дистиллятор RDFa удобным для перевода моего RDFa в альтернативные синтаксисы (их много), чтобы я мог проверьте мою работу.
Если RDFa подходит для вашего варианта использования, то посмотрите вики-сайт RDFa.info для и обзора распространенных ошибок . Даже в MySpace некоторые из них были неверными.
Следует отметить, что RDFa - не единственный способ опубликовать RDF, но он самый потрясающий: -)
The most known API for handling a set of semantic triples (subject,predicate, value) is called Jena: see http://jena.sourceforge.net/. There is a simple tutorial where you'll leran to manipulate a simple triple (RDF) store.
Start with this you'll then, later, learn RDFS/OWL (the ontology stuff)
I recommend reading an introduction about semantic web technologies such as link text. Then, you could get down to examining semantic web tools out there. A comprehensive list of these tools could be found at link text.
API RDF для .NET см. В http://razor.occams.info/code/semweb/