当前位置: 首页 > 面试题库 >

Java通用字段声明

阮梓
2023-03-14
问题内容

在没有泛型类型的类中,我想声明一个类似于以下内容的相当复杂的泛型字段:

public class Client {
    private Map<Class<T extends Serializable>, List<Consumer<S extends T>>> classToConsumerTry1;

    private <T extends Serializable, S extends T> Map<Class<T>, List<Consumer<S>>> classToConsumerTry2;
}

问题是Java编译器不会让我:)

所以我的问题是如何正确地引入T和S,而又不向类Client添加类型。

我的目标是强制Class成为您选择的类的子类型SerializableConsumer作为子类Class


问题答案:

你不能
唯一的选择是在Client类声明中声明泛型类型参数。如果您的Client类没有泛型类型参数,则其成员不能为泛型。您必须在类成员的声明中使用实际类型。



 类似资料:
  • 问题内容: 我正在学习Java泛型,我问自己这个问题。 这两个方法声明之间有什么区别? 和 问题答案: 在后者中,您可以引用范围内的类型,即。在前者中,您不需要。

  • 在java8中,可以访问java类的字段。朗。反思。使用例如。 在java12(从java9开始?)这只返回一个空数组。这不会改变,即使 设置。 有什么办法可以做到这一点吗?(显然,这可能不是一个好主意,我希望在junit测试期间通过反射更改代码中的“static final”字段 )

  • 我有一个< code>build.gradle和一个< code>local.properties文件。我想在< code>local.properties中声明一个值,该值未签入版本控制,以便在< code>build.gradle中使用。 我让< code>buildConfigField处理: 不幸的是,这会导致错误:

  • 问题内容: 如果我在一个类中有以下声明,其中是抽象类型: 是否能让我仍然能够更改中的对象的状态,但阻止我将新对象添加到列表中?如果我写错了,请您解释一下正在做什么以及何时应该使用关键字。 问题答案: 不,final关键字不会使列表或其内容不可变。如果您想要一个不可变的列表,则应使用: final关键字的作用是防止您为’synapses’变量分配新值。即,您不能写: 但是,您可以编写:

  • 如果我在一个类中有以下语句,其中Synapse是一个抽象类型: 最终是否允许我仍然能够更改列表中Synapse对象的状态,但阻止我向列表中添加新的Synapse对象?如果我错了,请您解释一下final正在做什么,以及我应该在什么时候使用关键字final。

  • 问题内容: 我试图通过反射接收字段值。问题是我不知道字段类型,必须在获取值时确定它。 这段代码会导致以下异常: 无法将java.lang.String字段com .... fieldName设置为java.lang.String 我尝试进行转换,但出现编译错误: 要么 我怎样才能做到这一点? 问题答案: 像之前回答的那样,你应该使用: 有时更喜欢的另一种方法是动态调用getter。示例代码: 还应