Tag: generics

是否需要在直通方法中使用有界通配符generics?

我知道在Collection中的以下方法中: public void addAll(Collection subcollection); 我们用Collection Collection允许一个仅存在子元素的集合,例如: List drivables = new ArrayList(); List cars = new ArrayList(); //we need the wildcard here, because of the following line: drivables.addAll(cars); 但是,我的以下方法需要这样的有界通配符吗? public static Collection requireNonEmpty(final Collection collection) throws NoSuchElementException { if (collection.isEmpty()) { throw new NoSuchElementException(“collection must be non-empty”); } return collection; } 它使用与Objects.requireNonNull(T object)类似的习惯用法,它实际上返回T object 。 […]

如何使用generics并从父类inheritance而不会导致名称冲突?

我在Java中有一个名为Flight的父类。 我有子类: JetFlight , NormalFlight等inheritance自Flight 。 我希望所有子类都从Comparable接口实现compareTo 。 我希望它们从Flightinheritance,因为我想使用多态(例如,启动一个Flight数组并用JetFlight , NormalFlight等对象填充它)。 这是我父类的代码: public abstract class Flight { public abstract int compareTo(Object o); } 这是其中一个子类的代码: public class JetFlight extends Flight implements Comparable { private int flightTime; public JetFlight(int flightTime) { this.flightTime = flightTime; } public int compareTo(JetFlight j) { return this.flightTime – j.flightTime; } } 由于2个错误,此代码将无法编译: […]

仅在运行时知道类型时使用Javagenerics

请考虑以下代码: public class Generics { C c; // initialized at runtime public void testGenericsCall(Object o) { c.myMethod(o); } } class C { public void myMethod(E input) { } } 这是有效的,但我收到警告,因为参数化的类C与原始类型一起使用。 我不能使用像这样的声明 C c; 因为C的类型仅在运行时才知道。 我也无法在类Generics中添加类型参数,因为我需要在知道C类型之前创建此类的对象。 C c; 要么 C c; 对于编译器来说没关系,但是然后方法testGenericsCall不能编译( “实际参数java.lang.Object无法通过方法调用转换转换为捕获#1?” ) 处理这种情况的最佳方法是什么? 编辑 :请注意,当我实际(在运行时)创建C的实例时,我知道它的类型参数,这部分代码是类型安全的并且运行良好。 在实际代码中,我没有一个单独的“C”类,而是一系列相互关联的类,并且generics绝对有用(即使在这个简化的例子中这并不明显 – 所以请不要只告诉我不要使用generics:)。 我已经有了编译时类型安全,但不是在这里,而是在C和其他类之间(这里没有显示)。 我看到在这种情况下我不能在编译时检查类型参数,这就是为什么我试图声明它C c 。 在这里, 我只是寻找在没有编译器警告的情况下桥接通用和非通用代码的最佳方法。

jackson解串器为通用类型

我需要为具有generics的类编写自定义反序列化器。 我找不到办法做到这一点,但我无法想象我是唯一有这个问题的人。 据我所知,有两种方法可以实现它,但它们都不是可实现的: 在反序列化器的构造函数中为反序列化器提供Class参数不起作用,因为在注册反序列化器时,Type.class与反序列化器实例之间的关系将丢失。 例如: public class Foo {} public class FooDeserializer { public FooDeserializer(Class type) { … } … } // Boilerplate code… module.addDeserializer(Foo.class, new FooDeserializer(Bar1.class)); module.addDeserializer(Foo.class, new FooDeserializer(Bar2.class)); 这不起作用,当ObjectMapper实例获取Foo的实例时,没有可用的generics参数的类型信息(类型擦除),因此它只选择最后注册的反序列化器。 在类中保留generics类型的引用没有帮助,因为类的实例化版本无法传递给反序列化器(接口是readValue(String,Class))。 例如: String json = “…”; ObjectMapper mapper = …; Foo foo = new Foo(Bar1.class); foo = mapper.readValue(json, Foo.class); // Can’t pass empty foo […]

Javagenerics类型,可以扩展,也可以是父类

我正在寻找一些如下所示的代码: public class Parent<T is_or_extends Parent> { public T function() { // do some stuff // return correct(); } public T correct() { return (T) this; } } 这样任何子类都可以访问其他父函数,但仍然是独立的类(没有将function()的返回值向上转换为Parent的实例)。 程序员也可以独立使用Parent类(因此可以创建Parent的实例而不使用function()向下转换返回对象) 执行: public class Child extends Parent {} 用法: Child child = new Child(); // ok Parent polymorph = new Child(); // ok Parent parent = […]

我如何知道Observer类在Java中发送的通用对象?

我正在使用Java实现Observer / Observable模式。 但是,我在代码的Observer部分遇到问题。 可观察 public class Model extends Observable { public void notify() { this.setChanged(); this.notifyObservers(new ArrayList()); this.notifyObservers(new ArrayList()); } } 观察 public class View implements Observer { @Override public void update(Observable observable, Object object) { // TODO: If object is ArrayList? System.out.println(“A”); // TODO: If object is ArrayList? System.out.println(“B”); } } 我如何填写TODO注释以检查ArrayList上的generics? 这有可能吗? […]

Java通用容器类

我正在研究用Java实现的进化仿真模型,并遇到一个关键的面向对象设计问题,我似乎无法解决这个问题。 问题可归纳如下: 我有一个基本的抽象类Player和两个具体的子类,Signaller和Receiver: abstract class Player { Strategy[] strategies; double fitness; … } class Signaller extends Player { double quality; …. } class Receiver extends Player { double[] weights; int chosenChannel; …. } 现在我需要代表Signalers和Receivers集合的类,我不得不使用数组来存储它们。 两种群体类型都有共同的方法,但也有信号器群体或接收器群体的特定方法。 从概念上讲 ,我需要这样的东西: abstract class Population { Player[] members; void mixUpPopulation() {…} Strategy[] getMeanStrategies() {…} double getMeanFitness() {…} … } class […]

为什么不创建一个Object 并转换为generics类型? 解决方案是什么?

一些开发人员通过创建Object[]并转换为generics类型来创建generics类型的数组,如以下示例代码所示: public class ArrTest { public void test(E a){ E[] b = (E[])new Object[1]; b[0] = a; System.out.println(b[0]); } public static void main(String[] args){ ArrTest t = new ArrTest(); t.test(“Hello World”); } } 该示例将起作用并且只有一个警告: Type safety: Unchecked cast from Object[] to E[] 。 气馁了吗? 这是创建generics类型数组的最佳方法吗? 如果我在我的软件中广泛使用此对象,是否会导致意外结果或exception?

Java通用枚举function使用java 8默认方法和实用程序类

下面是我提出的失败尝试,指的是使用Reflection的Java Generic Enum类 。 想找到一个更好的方法来做到这一点。 我用这种方法找到了几个问题: 每次我都需要传递类类型。 示例 – EnumUtility.fromKey(Country.class,1) fromSet在城市和国家都重复 public enum City implements BaseEnumInterface { TOKYO(0), NEWYORK(1); private final int key; public static Set fromValue(Set enums) { return enums.stream().map(City::getKey).collect(Collectors.toSet()); } public int getKey() { return key; } private City(int key) { this.key = key; } } public enum Country implements BaseEnumInterface { USA(0), […]

如何在java中强制转换为CRTP?

我有一个非常简单的例子,我做了一些基本的通用赋值: final Detail detail = field.getAnnotation(Detail.class); final String example = detail.example(); final Class type = field.getType(); if (List.class.isAssignableFrom(type)) … else if (Enum.class.isAssignableFrom(type)) setValue(contract, field, Enum.valueOf(type, example)); else if (…) ….. 但是Enum.valueOf()有点难以调用,在我的例子中,错误是: java.lang.Enum中的valueOf(java.lang.Class,java.lang.String)不能应用于(java.lang.Class,java.lang.String) 这非常有意义,因为type是Class 。 但由于Enum是CRTP,我找不到一种好的方法来转换类型以使编译器满意。 是使用原始类型Enum.valueOf((Class)type, example))唯一的答案? 它给了我2个警告,而不是只有一个。