Tag: generics

使用上边界通配符时不兼容的类型

我真的很困惑上界类型在Javagenerics中是如何工作的。 比方说我有 interface IModel interface I class A implements I class B implements I class C implements I 那么我有一个带参数的方法如下 foo(IModel<Map<? extends I, Map<? extends I, List>>> dataModel) 调用那个方法就像 IModel<Map<A, Map<B, List>>> model = … foo(model) 以编译错误结束 Error:(112, 49) java: incompatible types: IModel<java.util.Map<A,java.util.Map<B,java.util.List>>> cannot be converted to IModel<java.util.Map<? extends I,java.util.Map<? extends I,java.util.List>>> 我已经从Oracle网络上阅读了关于Javagenerics的文档,试图谷歌它,但必须有一些我完全被误解的东西。

Javagenerics:声明generics类型的映射值

我是仿制药的新手。 像Map一样 private static Map map; 和像这样的方法 public T getObject(final Class myClass) { return (T)map.get(myClass); } 如何更改map声明,以便在从方法返回时不必进行强制转换?

ProGuard混淆,java,Google Gson和通用集合 – 如何保留成员?

我有一个这样的课: public class MyClass { private Queue myQueue; } 我的问题是我无法让ProGuard在使用Google Gson序列化到json之后保留myQueue。 会发的是会员名称“myQueue”被序列化为“a”。 显然,反序列化会破坏。 以下是我尝试过的一些ProGuard配置。 -keepclassmembers class com.my.package.MyClass { #private java.util.Queue myQueue; #private java.util.Queue myQueue; private java.* myQueue; } 同 private java.util.Queue myQueue; …… ProGuard抱怨说这堂课不详。 消息是: 注意:配置引用未知类java.util.Queue’ 运用 private java.* myQueue; ….摆脱ProGuard警告,但是,正如我所说,成员myQueue没有保存在json输出中。 它被序列化为“a”。 其余的相关ProGuard配置如下: -renamesourcefileattribute SourceFile -keepattributes SourceFile,LineNumberTable -keepattributes *Annotation* #gson -keepattributes Signature -adaptresourcefilenames **.properties,**.gif,**.jpg,**.png,**.wav -adaptresourcefilecontents […]

使用一组固定类型对类进行参数化

假设我有一个generics类Foo ,它可以容纳T类型的对象。 此外,假设我只希望能够使用两种类型之一的对象来实例化类。 最后,假设这两个类型的最低公共上限是一个类型,它比我想要允许的那两个类型有更多的子类,所以我不能简单地为类型参数指定一个上限(如同在class Foo ),因为那时我将允许用除我期望的两种类型之外的其他类型来实例化该类。 为了说明,假设我希望Foo 只保留String或Integer 。 最低公共上限是Object ,因此指定上限不会起作用。 当然,我可以做一些事情 class Foo { private T obj; public Foo(T obj) throws IllegalArgumentException { if (!(obj instanceof String || obj instanceof Integer)) { throw new IllegalArgumentException(“…”); } this.obj = obj; } } 但是,在这种情况下,我仍然可以使用任何对象调用构造函数; 如果我尝试使用既不是String也不是Integer来实例化它,我将在运行时获得exception。 我想做得更好。 我希望编译器静态地(即,在编译时 )推断我只能使用String或Integer对象来实例化该类。 我正在思考这些方面可能会做的事情: class Foo { private T obj; public […]

Java方法引用具有generics参数的方法

我正在尝试对一个方法进行方法引用,该方法具有在类声明中指定的generics参数。 所以我有: public interface IExecutable { void execute(P parameter); } public class Parameter implements IParameter { public void childSpecific() { … } } public class TestClass { … //somewhere in the code public void foo(Parameter parameter) { parameter.childSpecific(); } public void test() { IExecutable executable = this::foo; //compilation error // The type TestClass does not […]

在使用generics(Java)的扩展接口中覆盖方法契约?

我试图覆盖扩展另一个接口的接口中的方法声明。 这两个接口都使用generics。 根据Java教程,这应该是可能的,但该示例不使用generics。 当我尝试实现它时,编译器显示以下错误(我已经替换了名称,因为某些代码不是我自己的。): InterfaceExtended中的myMethod(T)与Interface中的myMethod(T)冲突; 两种方法都有相同的擦除,但都不会覆盖另一种方法。 代码如下所示: public interface Interface { public void myMethod(T x); } public interface ExtendedInterface extends Interface { public void myMethod(T x); } 如果有人建议如何改变它以使其可接受,或解释这是导致问题的原因,我将非常感激。 谢谢! badPanda

被Javagenerics混淆需要强制转换

我对以下代码感到困惑: import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class GenericsTest { public void foo() { T var = (T) new LinkedList(); } public static void main(String[] args) { GenericsTest gt1 = new GenericsTest(); gt1.foo(); System.out.println(“Done”); } } 无论我传递给构造函数的Type参数如何, T的运行时类型似乎都是java.util.List 。 那么为什么编译器在分配var时需要转换为T ? 它不应该在编译时知道LinkedList可以分配给List吗? 我理解代码是假的,我理解为什么它在运行时工作,即使它看起来不应该。 令我困惑的部分是为什么编译器要求我在进行赋值时键入(T)? 然而,如果没有伪造的话,它就可以很好地编译。 据推测,编译器理解擦除。 看起来编译器应该能够在没有强制转换的情况下编译代码。

(generics)不能对非静态类型T进行静态引用

运行Demo类将在SomeClass中调用静态方法newInstance来调用构造函数并打印hello 定义方法将包含带参数的返回类型+方法名称 newInstance的返回类型是 SomeClass 对我来说似乎很奇怪,因为我的类被称为SomeClass 而不是 SomeClass 为什么我需要在SomeClass 前面的? 似乎如果我不包含它,将会出现一个常见错误,称为无法对非静态类型T进行静态引用 另外需要指出的是,我可以在和SomeClass 之间放置许多空格,因此它们似乎不需要在一起。 public class SomeClass { public static SomeClass newInstance(Class clazz){ return new SomeClass(clazz); } private SomeClass(Class clazz){ System.out.println(“hello”); } } public class Demo { public static void main(String args[]) { SomeClass instance = SomeClass.newInstance(String.class); } }

如何在java中参数化generics单例

我有下一个问题。 我有一个界面: public interface Worker { public void start(Class taskClass); } 和单接口实现此接口: public final class Listener implements Worker { private Listener() {} @Override public void start(Class taskClass) { … } public static Listener getInstance() { return SingletonHolder.INSTANCE; } private static class SingletonHolder { public static final Listener INSTANCE = new Listener(); } } 我的问题是,我可以通过这种方式得到单例实例: Worker […]

Gson:解析generics集合

是否可以创建一个从jsson解析generics集合的方法? 我上面的aproach不起作用,因为在运行时gson在这里返回LinkedHasmaps的ArrayList,但是在编译时没有错误。 private ArrayList readArray(String json) { Gson gson = new Gson(); Type collType = new TypeToken<ArrayList>() { }.getType(); return gson.fromJson(json, collType); } 我已经在这里看过一些类似的问题: 使用Gson的generics类型 ,但我找不到解决方案,这确实有效。