Tag: generics

Java Generics:在运行时是否保留了有关generics类型的任何元信息?

背景 我对Javagenerics的理解是它完全是一个编译时function(主要关注类型安全检查)。 任何generics类的类型信息在运行时丢失( 类型擦除 )。 不过,我看到许多框架似乎也在运行时利用了类型信息。 例如,谷歌guice 提供商 。 guice提供程序可以在运行时实例化并提供它的generics类型的新实例。 class Container { @Inject public Container(Provider contentProvider) { //This works at Runtime… but How ??? //When type’s are not even preserved at runtime, how does the Provider knows it has to instantiate an object of type ‘Content’ Content content = contentProvider.get(); } } 题 是否存在与在运行时保留的generics类型相关的任何信息。 […]

原始类型,无界wilcard和有界通配符

我有一个简单的问题如下:这是一个关于这整个问题的简单例子: List a = new ArrayList(); List b; List c; 根据khalid mughal的Java SCJP(一本非常好的书!): a = b; // ok. Widening conversion. b = a; // ok too. No unchecked warning. b = c; // ok c = b; // ok c=a; // ok but now will issue a unchecked warning. // clause 1 我确实理解任何原始类型(例子a)在分配给任何有界威尔卡引用时,未经检查的警告都是问题(因为原始类型中的内容可以是任何东西)。 我的问题是因为c是最高上限(?扩展对象),不应该在没有该警告的情况下分配给c?

在进行通用转换时,在generics方法中捕获ClassCastException

假设我有一个方法 @SuppressWarnings(“unchecked”) public T getNumber() { try { return (T)number; } catch (ClassCastException e) { return null; } } 假设number是Integer一个实例,调用方法就像 Float f = getNumber(); 结果成为ClassCastException 。 我知道(不知何故)这是因为类型擦除,但有人可以提供更深刻的解释为什么exception升级到赋值级别并且不能在方法内捕获? 注意:我确实有版本public T getNumber(Class classT) ,它检查public T getNumber(Class classT)中的类型,但希望摆脱传递classT并停止想知道上述问题。

RequestFactory:代理实现与generics的接口

我正在努力处理requestfactories和generics。 在下面的代码中,代理方法与实体方法完全匹配,但我得到了日志跟踪: java.lang.NullPointerException: null at com.google.web.bindery.autobean.vm.impl.MethodPropertyContext.traverse(MethodPropertyContext.java:102) ~[gwt-servlet-2.6.0.jar:na] at com.google.web.bindery.autobean.vm.impl.MethodPropertyContext.accept(MethodPropertyContext.java:75) ~[gwt-servlet-2.6.0.jar:na] at com.google.web.bindery.autobean.shared.impl.AutoBeanCodexImpl$PropertyCoderCreator.maybeCreateCoder(AutoBeanCodexImpl.java:353) ~[gwt-servlet-2.6.0.jar:na] at com.google.web.bindery.autobean.shared.impl.AutoBeanCodexImpl$PropertyCoderCreator.visitReferenceProperty(AutoBeanCodexImpl.java:341) ~[gwt-servlet-2.6.0.jar:na] at com.google.web.bindery.autobean.vm.impl.ProxyAutoBean.traverseProperties(ProxyAutoBean.java:324) ~[gwt-servlet-2.6.0.jar:na] at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.traverse(AbstractAutoBean.java:166) ~[gwt-servlet-2.6.0.jar:na] … 我的代理类: @ProxyFor(value = OutilLibre.class, locator = OutilLibreLocator.class) public interface OutilLibreProxy extends ProxyWithId, ProxyWithCartoLibre, EntityProxy { public Long getId(); public void setId(Long id); @Override OutilProxy getCompetence(); @Override void setCompetence(OutilProxy outil); @Override String getCompetenceAutre(); […]

为什么A-> B不会使List – > List ? 这不会消除对通配符的需求吗?

免责声明:我不是专业开发人员,我不打算成为一名开发人员。 关于Java的阅读书,因为我想尝试Android编程,没有任何以前的Java经验。 我正在读这本书 – 我更喜欢它。 我已经阅读了关于generics类的章节的一部分,到了他们提到通配符的地步,并且感到困惑。 如果B延伸A: List 不是 List的子类型(据我所知,它们完全相同) List List是List的子类型List List 后者允许编写接受generics类型参数的函数 – 例如List List 。 这样的函数会接受List或List 。 现在,对于我的问题: 以类似于C ++(以“模板”风格)的方式实现generics不是更简单吗? 这将使List和List两种不同的类型,这些类型将以预期的方式相关。 这也可以简单地在函数中声明你期望参数是List类型,这将允许List适合那里。 我猜测不仅仅是“我们讨厌C ++,让我们做出与众不同”这一点:)我很可能还不知道什么,这使得通配符成为一个非常有用的工具。 你对此有何看法? 编辑:如果您在答案中提到List ,请记住使用反引号,以避免被解释为HTML标记。

List和List 之间的区别

我已经读过很多关于此的内容了,我知道: List listOfObject = new ArrayList(); // (0) //can only work for TYPE == Object. //if TYPE extends Object (and thus objects of type TYPE are Objects), //this is not the same with Lists: List is not a List 现在我已经读过以下内容: List undefinedList = new ArrayList(); // (1) //works for ANY type (except for primitives) 和 […]

Javagenerics方法约束 – 从约束中排除类型以防止擦除问题?

我试图基于类型约束重载方法。 代码看起来像这样: protected static void addComponent(List factors, T component) { … } protected static void addComponent(List factors, T conditionalComponent) { …. } ComponentTemplate是一个抽象类, ConditionalComponent是一个接口。 这两种方法可以将组件添加到组件列表中。 在组件实现ConditionalComponent的情况下,将使用其他方法来确定是否应添加特定组件。 当对象未实现ConditionalComponent时,将使用完全不同的方法。 问题是这些方法具有相同的擦除(根据RAD,当然拒绝编译)。 有没有办法定义第一个方法,以便它排除任何扩展ComponentTemplate和ConditionalComponent对象? 我想象过这样的事情: protected static void addComponent(List factors, T component) { … } 但是,当然,这不起作用(它不是有效的语法)。 我正在尝试做什么,或者是否有解决方法?

generics和访客模式

我对访问者模式和generics有问题。 我有一些抽象的class级,他们的孩子将被访问。 看看这段代码: public abstract class Element extends SomeSuperClass { public void accept(Visitor v) { v.visit(this); } } public interface Visitor { void visit(T element); } 所以我的想法是:我有一些类层次结构(例如, Element是SomeSuperClass的子类)。 我有一些通用的Visitor界面来访问这个层次结构。 现在在这个层次结构的中间是Element类,它是抽象的并且拥有它自己的子类。 现在我希望Element接受其子类的所有访问者,这就是我放这行的原因: public void accept(Visitor v) 但现在我收到错误: 方法访问( capture#1-of ? extends Element )类型为Visitor Visitor不适用于参数( Element )。 我明白了? extends Element ? extends Element不是Element 。 我的问题是:我可以用不同的方式表达我的想法吗? 或者我在这种情况下错过了generics的想法?

如何获取generics方法参数的类型参数类?

如何获取传递给方法的参数的类型参数? 比如我有 List list = new ArrayList(); public class Datastore { public void insert(List tList) { // when I pass the previous list to this method I want to get Person.class ; } }

具有下限的嵌套通配符

所以我阅读了主要的Java通用常见问题解答,让我掌握的一件事就是具有下限的嵌套通配符。 我想举例说明我所理解的内容,具体哪些有效,以及我如何看待它。 也许你可以告诉我我正在考虑的方式这是错误的,即使编译器没有抱怨“好”的情况。 示例1(有意义): static void WildcardsMethod(List<? extends Pair> list) { System.out.println(“It worked”); } static void TestWildcardsMethod() { List<Pair> list = null; WildcardsMethod(list); } 我首先看看最深的通配符并绑定WildcardMethod的签名。 它正在寻找Pair Pair 。 因此,我可以使用Pair , Pair等。 如果我决定用Pair代替Pair我现在有一些看起来像下面代码的东西Pair Pair : List<? extends Pair> 现在,通配符表示参数化类型Pair的类型/子类型。 因此,我可以将Pair或SubPair传递给WildcardsMethod。 例2(有意义): static void WildcardsMethod(List<? extends Pair> list) { System.out.println(“It worked”); } static void TestWildcardsMethod() { List<Pair> […]