初始化带有类型参数的类时遇到问题。这似乎是Java类型推断的一个缺点,我想知道是否有办法解决这个问题,或者有更好的方法实现这个问题。
public class ParentModel {}
public class ChildModel extends ParentModel {}
public class Service<E extends ParentModel, T extends Collection<E>> {
private Class<T> classOfT;
private Class<E> classOfE;
public Service(Class<E> classOfE, Class<T> classOfT) {
this.classOfE = classOfE;
this.classOfT = classOfT;
}
}
public class BusinessLogic {
public void someLogic() {
Service<ChildModel, ArrayList<ChildModel>> service = new
Service<ChildModel, ArrayList<ChildModel>>(ChildModel.class, ArrayList.class);
}
}
编译时错误在BusinessLogic::someLogic()
中:
构造函数服务
编译成Java7。
因为没有ArrayList这样的东西
Service<ChildModel, ArrayList<ChildModel>> s1 =
new Service<>(ChildModel.class, (Class) ArrayList.class)
调用的不同之处在于,这里我们使用的是原始类型
类
,而在您的示例中使用的是类型类
另一个选项是从实际实例获取类型:
Class<ArrayList<ChildModel>> fromObj =
(Class<ArrayList<ChildModel>>) new ArrayList<ChildModel>(0).getClass();
这更为详细,但我更喜欢原始类型(在这两种情况下,您都会收到编译器警告)
因为Java中的泛型是“通过擦除”实现的,所以没有类
你能做的是允许超类型。
Class<? super T> classOfT;
Class<? super E> classOfE;
public Service(Class<? super E> classOfE, Class<? super T> classOfT) {
或者,您可以对类进行双重强制转换:
Class<ArrayList<Integer>> clazz =
(Class<ArrayList<Integer>>) (Class<? super ArrayList>)
ArrayList.class;
但是要注意:这个类只是
ArrayList
——Java在运行时不会对泛型执行额外的类型检查。你自己看看:
ArrayList<Integer> a1 = new ArrayList<>();
ArrayList<Double> a2 = new ArrayList<>();
System.out.println(a1.getClass() == a2.getClass());
这是同一个班级。在运行时,泛型几乎消失了
问题内容: 因此,我正在开发这个通用的HashTable类,并且希望将其通用地用于任何数量的传入类型,并且我还想将内部存储数组初始化为LinkedList的数组(出于冲突目的),其中为确保类型安全,每个LinkedList都被预先指定为HashTable类中的泛型类型。我该怎么做?以下代码最能阐明我的意图,但当然不会编译。 问题答案: Java中的泛型不允许创建具有泛型类型的数组。您可以将数组转换
问题内容: 我有一个笼子课: 我试图在另一个类main方法中实例化Cage对象: 我收到错误:笼子是原始类型。泛型Cage的引用应参数化。我尝试了几个想法,但对这种棘手的语法感到困惑:o( 问题答案: 是通用类型,因此您需要指定一个类型参数,例如这样(假设有一个): 您可以使用任何扩展的类型(甚至是自身)。 如果省略type参数,那么在这种情况下最终得到的是。但是,即使这是您想要的,您仍应明确声明
问题内容: 我在我的应用程序中使用ArrayList。 我想知道从Singleton类初始化ArrayList的确切过程。 该数据将在其他一些活动中使用。 有人可以帮助了解Singleton课堂吗? 问题答案: 这是创建单例类的方法: 任何需要调用arrayList的地方都可以: 要将元素添加到数组,请使用: 要么
问题内容: SuperClass object = new SubClass(); 为什么使用超类实例化上面的子类对象?因为我学会实例化对象的唯一方法是: 我正在学习Java。 问题答案: 您可能有一个仅接受实例的方法。由于 是 ,您可以使用的实例并将其视为。 使用接口时,会使用相同的行为: 这就是多态的美。它允许您更改类内部的实现,而无需破坏其余代码。
我想使用“=”符号初始化MyClass的对象。 例如。字符串a=“你好”; 我想做 这是我用构造函数写的类
我用一些init参数创建了一个User类,但在执行时得到了TypeError,如下所示:“hocust-f stress.py--headless-u 100-r 100-t 1m” Traceback(最近一次调用最后一次):文件src/gevent/greenlet.py,第906行,在gevent._gevent_cgreenlet。Greenlet.run文件/库/框架/Python.fr