我正试图解决一个泛型问题。我在做一些手工选角,感觉好像我做错了什么。我对使用泛型有点陌生,所以很有可能我在某些方面误用了它们。如能提供指导,将不胜感激。
TLDR:
我有一个带有泛型方法的接口,该泛型方法采用T
参数。我在一个类中实现了这个接口,但在实现器中,我希望确保t
是特定类型的(假设animal
,这样我就可以提取一些字段)。我怎么能那样做?
详细信息:
下面有一个接口transformer
和一个实现类,其中specialtransformer实现transformer
。
transformer
具有以下定义:
public interface Transformer
public <T> Event transform(T input);
而specialtransformer
具有以下定义:
public class SpecialTransformer implements Transformer
@Override
public <T> Event transform(T input) {
Animal convertedInput = (Animal) input; // <------- This feels wrong
String color = convertedInput.getColor();
//Other field based logic
}
不应该将泛型约束放在方法上,而应该将约束放在接口(和类)上:
java prettyprint-override">public interface Transformer<T> {
Event transform(T input);
}
在类上,您可以将一个新的泛型类型约束在animal
及其子类(或实现)上:
public class SpecialTransformer<T extends Animal> implements Transformer<T> {
@Override
public Event transform(T input) {
String color = input.getColor();
//Other field based logic
}
}
或者直接使用animal
作为transformer
的类型:
public class SpecialTransformer implements Transformer<Animal>
问题内容: 我有一个方法以a 作为参数。 在中,我如何知道a 是还是a 是? 问题答案: 根据用户omain的回答“如果使用<?>,则意味着您将不会在任何地方使用参数化类型。要么转到特定类型(在您的情况下,似乎是),要么转到非常通用的“ 另外,我相信如果您使用问号,编译器将在运行时(类型;有效Java的第119页)消除类型不匹配的情况,绕过擦除,并有效地消除了使用泛型类型所带来的好处? 要回答发问
我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类
问题内容: 此代码似乎正常工作 方法类型参数是否会遮盖类类型参数? 另外,在创建对象时,它是否使用类的type参数? 例 在它们 不冲突 的情况下,这通常适用于类的类型参数 吗? 我的意思是,当只有类具有类型参数而不是构造函数时,还是在构造函数中查找类型参数?如果他们 确实发生冲突 ,这将如何改变? 请参阅下面的讨论 如果我有一个函数调用 问题答案: 您所有的都不同,但是只有使用完整的语法调用方法
我试图创建一个Java方法,它接受一个对象类型和它应该转换成的数据类型。 例如,如果我应该能够返回一个值1作为Int或双根据需要。我使用类传递数据类型作为参数。 问题:如何使方法泛型以接受基于输入参数的返回类型? 下面的代码只是一个示例,它可能在语法上不正确,用于解释我的问题。
问题内容: 我正在定义一个类: 编译器抱怨被隐藏。我猜第二次出现在定义中是第一次隐藏在范围内,好像可以将变量分配给两种不同的类型一样。如何正确做? 编辑: 这是一个内部阶级。完整的代码可以是: 现在的问题是,如果我重新提名内部人,我不确定那是和实际上是相同的类型。 问题答案: 不要将内部类参数化: 作为声明中定义的内部(非静态嵌套)类,仍将具有in的含义,因为每个类都对其外部实例具有隐式引用。
问题内容: 我试图理解Java泛型,它们似乎很难理解。例如,这很好… …就是这个… … 还有这个 … …但是不能编译: 有人可以用简单的语言解释发生了什么吗? 问题答案: 对于泛型类型,主要要了解的是它们不是协变的。 因此,尽管您可以这样做: 以下内容将无法编译: 这是为了避免您绕过通用类型的情况: 因此,一一讲解您的示例 1个 您的通用方法采用a ,而您采用;(基本上是)。可以分配给类型,并且编