Я знаю, что java не предполагает поддержку общих аргументов, которые являются примитивными типами, и, конечно же, что-то вроде:
Vector<byte> test;
не скомпилируется.
однако с небольшим количеством рук, которые я случайно выполнил в программе, я обнаружил, что на самом деле можно создать общий объект с примитивным типом (метод, показанный ниже)
Кроме того, java ложно позволяет этому экземпляру присваиваться переменной типа Vector<Byte>
, когда, как показывают операторы печати, byte.class и Byte.class являются двумя отдельными животными. Из-за этого попытки совершения вызовов по объекту приводят к неожиданным и странным поведениям/ошибкам.
Является ли это ошибкой java? или есть какая-то рифма или причина этого безумия? Похоже, что даже если java допускает непредвиденное поведение создания примитивных типизированных типов, они не должны быть назначены для общего типа оболочки, который имеет отдельный класс из примитива.
import java.util.Vector;
public class Test
{
//the trick here is that I am basing the return type of
//the vector off of the type that was given as the generic
//argument for the instance of the reflections type Class,
//however the the class given by byte.class yields a non-class
//type in the generic, and hence a Vector is created with a
//primitive type
public static <Type> Vector<Type> createTypedVector(Class<Type> type)
{
return new Vector<Type>(0,1);
}
public static void main(String ... args)
{
//these lines are to demonstrate that 'byte' and 'Byte'
//are 2 different class types
System.out.println(byte.class);
System.out.println(Byte.class);
//this is where I create an instance of type Vector<byte>
//and assign it to a variable of type Vector<Byte>
Vector<Byte> primitiveTypedGenericObject = createTypedVector(byte.class);
//this line causes unexpected exceptions to be thrown
//because primitiveTypedGenericObject is not actually type
//Vector<Byte>, but rather Vector<byte>
primitiveTypedGenericObject.set(0,(byte)0xFF);
}
}