Tag: generics

Javareflection:获取正确类型的参数化通用超类方法

我使用reflection来发现类及其超类的方法,以及方法参数和返回值的类型。 这大部分都有效,但我遇到了一些特定的通用案例。 假设我有一个基类: package net.redpoint.scratch; public class Base { public E getE() { return null; } } 还有一个子类: package net.redpoint.scratch; public class Derived extends Base {} 使用reflection我可以遍历Derived的方法并获取arg和返回类型(代码省略,但它工作正常)。 但是,我也想知道inheritance的方法。 使用下面的代码,我可以非常非常接近。 但是获得getE()的正确返回类型是我的选择。 我可以得到generics类型“E”但不是实际类型“java.lang.String”: package net.redpoint.scratch; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; public class Scratch { public static void main(String[] args) throws Exception { Class clazz […]

如何用Orika映射generics对象?

我正在使用Orika 1.4.5,我想让我的BidirectionalConverter将PaginatedResponse to PaginatedResponse映射PaginatedResponse to PaginatedResponse ,反之亦然。 PaginatedResponse类如下: public class PaginatedResponse { private List items; private List orderBy; private PagingResponse paging; public PaginatedResponse(List items, List orderBy, PagingResponse paging) { this.items = items; this.orderBy = orderBy; this.paging = paging; } // Getters } 所以我希望我的PaginatedResponseCovnerter接受所有的地图调用,其中转换是PaginatedResponse object1 to PaginatedResponse object2 ,我希望object1和object2具有相同的orderBy和paging属性。 所以我尝试这样做: public class PaginatedResponseConverter extends BidirectionalConverter<PaginatedResponse, PaginatedResponse> […]

如何在Java中实例化generics方法参数的实例?

请考虑以下代码: // … public class BaseClass { public BaseClass (int theParam) { // …whatever… } } public class DerivedType { // …Content does not matter… } // …elsewhere: public boolean doIt (ArrayList target) { ElemType newElem=new ElemType (5) ; // “Cannot instantiate this type” // …other code does not matter… return true ; } // […]

Java:一个具有许多返回类型的函数……是否可以使用generics?

我有一些程序,为简单起见,看起来如下: public String fetchValueAsString(String key); public DateTime fetchValueAsDateTime(String key); 我想要类似的东西 public X fetchValue(String key); // pseudo-code 我可以像这样调用(没有强制转换;传递的参数隐含类型): String str = fetchValue(“subject”); DateTime dt = fetchValue(“startDate”); 我知道我可以只有一个方法返回Object类型并只进行转换,但我想知道是否有一种方法可以只调用一个方法,并以某种方式使用generics来确定返回值。 那么,它是否可能在Java中( 它在C#中 )?

在Dataflow Generic中进行转换

这与另一个SO问题[此处]( 设置自定义编码器和处理参数化类型 )有关。在解决方法之后,帮助我在变换中使用自定义类型。 但由于我的自定义类型是通用的,我希望甚至使变换类通用,然后可以使用相同的类型参数化自定义类型。 但是当我尝试这样做时,我遇到了无法为类型变量T提供编码器,因为实际类型由于擦除而未知 。 解决方案建议注册一个可以返回类型参数的编码器,但由于类型参数本身是未知的,我想这个exception会抛出,我不知道如何解决这个问题。 static class Processor extends PTransform<PCollection, PCollection<KV<String, Set<CustomType>>>> { private static final long serialVersionUID = 0; @Override public PCollection<KV<String, Set<CustomType>>> apply(PCollection items) { PCollection<KV<String, Set<CustomType>>> partitionedItems = items .apply(ParDo.of(new ParDoFn())); PCollection<KV<String, Set<CustomType>>> combinedItems = partitionedItems .apply(Combine.<String, Set<CustomType>>perKey(new Merger())); } }

使用Jackson将使用generics的类序列化为JSON

我有一个表示调查问卷的对象结构,我需要序列化为JSON。 结构的一个类是OpenQuestion,这个类使用带有两个参数的generics。 当使用的类型之一是Date时,问题开始,日期序列化错误,如长。 class级代码: public class OpenQuestion extends AbstractQuestion implements Serializable { private valueType value; private validationType minValue; private validationType maxValue; … } 我看到如果哈希映射总是使用Date,如何在哈希映射中序列化日期,但在这种情况下,我使用带有String,Integer或Date的类。 有什么想法解决它吗? 谢谢

为什么我不能扩展接口“generics方法”并将其类型缩小到我inheritance的接口“class generic”?

我展示了一个我的意思的例子,哪个更容易。 想象一下,generics类型C表示颜色类型:因此,为了直观简化,假设C是C扩展颜色 interface Screen { Background render(Plane plane); } interface MonochromeScreen extends Screen{ @Override Background render(Plane plane); } 这将引发名称冲突编译错误,说明两者都具有相同类型的擦除但不可覆盖。 但我无法理解为什么我们不能简单地允许覆盖签名,只要它更具限制性。 我的意思是,毕竟,唯一的区别是generics类型的范围,在Screen中是方法范围的,而MonochromeScreen是在类范围内。 允许子方法在其父级在类级别强制执行时允许子方法作为方法范围的generics覆盖是没有意义的,但我认为它不这样做:我的父接口可以有20个方法与不相关的generics类型,但我的子类将强制它们全部与非不兼容的额外规格/合同相同(这是任何扩展接口所做的),毕竟,单色屏幕仍然是一个屏幕,因为它可以涂上任何颜色,我只是强制执行该颜色,无论哪个颜色,都与孩子的其他function保持一致,只是缩小了课堂级别的可能性,而不是方法级别。 考虑这个function有没有根本错误的假设? 编辑:我接受了Sotirios Delimanolis的回答,因为他非常聪明地发现了正确的麻烦而且我没有要求解决方案,但是对于那些想要知道如何克服这种情况的人来说,有一个技巧在我自己的答案中解释

无法将对象添加到List 实例化为ArrayList

我问这个问题是因为在Stack上讨论了一个答案 。 声明如下: 给出以下代码: List list =new ArrayList(); 我们为什么不能这样做: Integer e = 2; list.add(e); 尽管我们将列表实例化为ArrayList ,但这会引发编译器错误。 这是为什么 ?

Java Generic HashMap实现:对象无法转换V

我正在尝试实现一个通用的HashMap,但由于某种原因,java编译器不允许我返回正确的generics类型。 这是我的HashMap代码: public class SimpleHashMap { private int tableSize; private HashEntry[] table; public SimpleHashMap(){ table = new HashEntry[tableSize]; for(int i = 0; i < table.length; i++){ table[i] = null; } } public V put(K key, V value){ int keyIndex = getHashCode(key); if(table[keyIndex] == null){ table[keyIndex] = new HashEntry(key, value); } else{ table[keyIndex] = new HashEntry(key, […]

Apache Avro框架可以在序列化期间处理参数化类型吗?

Apache Avro可以在序列化期间处理参数化类型吗? 当我尝试序列化使用generics的实例时,我看到从Avro框架抛出此exception – org.apache.avro.AvroTypeException: Unknown type: T at org.apache.avro.specific.SpecificData.createSchema(SpecificData.java:255) at org.apache.avro.reflect.ReflectData.createSchema(ReflectData.java:514) at org.apache.avro.reflect.ReflectData.createFieldSchema(ReflectData.java:593) at org.apache.avro.reflect.ReflectData$AllowNull.createFieldSchema(ReflectData.java:75) at org.apache.avro.reflect.ReflectData.createSchema(ReflectData.java:472) at org.apache.avro.specific.SpecificData.getSchema(SpecificData.java:189) 我尝试序列化的类看起来像这样 public class Property { private T propertyValue; } 我正在尝试根据传入的POJO实例动态生成架构。 我的序列化代码如下所示 – ByteArrayOutputStream os = new ByteArrayOutputStream(); ReflectData reflectData = ReflectData.AllowNull.get(); Schema schema = reflectData.getSchema(propertyValue.getClass()); DatumWriter writer = new ReflectDatumWriter(schema); Encoder encoder = EncoderFactory.get().jsonEncoder(schema, os); […]