【Java自学-泛型 泛型转型】教程文章相关的互联网学习教程文章

如何将Cloneable类型用作Java泛型类的参数【代码】

我有一个通用类,需要能够克隆参数类型的对象.下面是一个非常简单的例子.编译器声称来自Object类型的clone()不可见.public class GenericTest<T extends Cloneable>{T obj;GenericTest(T t){obj = t;}T getClone(){// "The method clone() from the type Object is not visible."return (T) obj.clone();}}我宁愿不让调用者进行克隆,因为还有其他事情必须发生以维护对象的完整性.上面的代码只是问题的一个例子,没有我必须维护的与克...

Java – 没有泛型的Idiot-Proof迭代的API设计【代码】

当您为代码库设计API时,您希望它易于使用,并且难以使用.理想情况下,你希望它是白痴证明. 您可能还希望使其与无法处理泛型的旧系统兼容,例如.Net 1.1和Java 1.4.但是你不希望从较新的代码中使用它会很麻烦. 我想知道以一种类型安全的方式使事物易于迭代的最佳方法…记住你不能使用泛型,所以Java的Iterable< T>就像.Net的IEnumerable< T>一样. 您希望人们能够在Java中使用增强的for循环(对于Item i:items),以及.Net中的foreach / Fo...

java泛型类型擦除【代码】

声明具有类型参数的类时< T延伸A& B& C>,类型擦除过程将用A类替换T.但是如果T类型的变量调用接口B或C中的方法声明,Java会用它做什么? 当我们创建一个泛型类型的实例,如ArrayList< String>时,类型参数String也将被删除,但调用get方法将返回类型字符串,这些信息来自哪里,因为它已被删除? 我知道使用java反射,但我需要一些具体的解释.解决方法:不使用反射 – 铸造是.例如,请使用以下代码:interface A {void a(); }interface B {voi...

java – 将枚举声明为泛型参数时获取枚举的values()【代码】

下面显示的代码确实有效,因为方法values()是静态的.我的问题是如果B不是通用的,我怎样才能实现下面的代码.class A<B extends Enum<B>> {public A() {for (B b : b.values()) {}} }我可以想到两个解决方案: >将枚举值传递给A的构造函数> make B实现一个接口,定义获取枚举值的方法. 对我来说两者都显得凌乱.谁有更好的解决方案?解决方法:尝试使用getEnumConstants()

Java泛型:声明泛型类型的映射值【代码】

我是仿制药的新手. 有地图就好private static Map<String, Object> map;和像这样的方法public <T> T getObject(final Class<T> myClass) {return (T)map.get(myClass); }如何更改地图声明,以便在从方法返回时不必进行强制转换?解决方法:您需要创建泛型类,而不是通用方法:public class MyClass<T> {private Map<String, T> map;public T getObject(final String key) {return map.get(key);} }另外,我将参数从Class更改为String.如...

Java接口 – 泛型【代码】

我有两个接口.接口A和接口B,它扩展了接口A.现在,我有一个类,它喜欢保持实现A或B的对象的引用.我想为它提供setter.我试过下面,但是获得类型错误匹配异常.public interface A { }public interface B extends A { }public class AB { private Class<? extends A> object;public void setObject(Class<? extends A> o){this.object = o; } }基本上,我希望setObject方法接受一个实现接口A或B的对象.解决方法:简单回答: 输入A:setObjec...

java – 是否有“超类”方式来定义泛型中的类型或仅“扩展”?【代码】

这个想法是做类似下面的事情并让编译器在编译时检查toLoad是一个可以包含AType对象的数组(即:AType扩展或者是T NOT T扩展或者是AType).有没有办法用泛型做到这一点?private List<AType> aList_;<T superclassof AType> T[] loadArray(T[] toLoad) {for(int i = 0; i < alist_.size(); ++i) {toLoad[i] = (T)aList_.get(i); }解决方法:不… Java不允许类型变量的下限,即使有一些有效的用例……就像你的一样. 如果使用List,我们可以...

java – 如何为泛型对实现equals?【代码】

只是为了好玩,我正在尝试用Java实现泛型Pair类.我在使用equals时遇到麻烦:public class Pair<A, B> {public final A _1;public final B _2;// ... unnecessary details left out ...public boolean equals(Pair<A, B> that){return (_1.equals(that._1)) && (_2.equals(that._2));}@Overridepublic boolean equals(Object o){return (o instanceof Pair<A, B>) && equals((Pair<A, B>) o);} }然而,对实例< A,B>似乎不起作用.这是为...

将泛型类型作为Java中的泛型方法参数传递【代码】

首先让我为可怕的头衔道歉,但我不知道如何用一句话来总结这一点.public class GenericFun {public class TypedStream<I extends OutputStream> {I input;public I getInput() { return input; }public void setInput(I input) { this.input = input; }}public abstract class GarbageWriter<I extends OutputStream> {public void writeGarbage(I output) throws Exception {output.write("Garbage".getBytes());}}public class Ga...

java – 实例化泛型类型【代码】

我正在尝试将现有类转换为使用泛型,并且在转换构造函数时感到难过. 原始类是一个POJO,包含在基于文本的控制台游戏中从一个房间移动到另一个房间的逻辑.从字面上看,它是一个类,它包含一些可触发动作的字符串触发器(例如,用户键入“向右走”),描述和指向新位置的指针. 该类的当前非泛型版本如下所示:public class Navigation implements Serializable {private static final long serialVersionUID = 1L;private String trigger;pri...

Java泛型理解【代码】

参见英文答案 > What is a raw type and why shouldn’t we use it? 15个能告诉我这里发生了什么以及为什么它没有错误.List list = new ArrayList<String>(); list.add(1);对不起,如果已经有类似的问题,我没有正确地提出问题,所以不能谷歌解决方法:这里发生的事情暴露了类型擦除的弱点,这是Java泛型背后的机制.更改其泛型类型参数时,ArrayList的实现不会更改:它始终位于场景后面的java.lang.O...

java – 我的方法泛型参数有什么问题【代码】

我想用通用映射填充List,但我的代码不能编译.我已经为这个问题准备了最简单的例子.在上面的注释问题中,我把错误放在下面的行中.void populateList(List<? extends Map<String,?>> list) {list.clear();HashMap<String, ?> map;map = new HashMap<String,String>();//The method put(String, capture#2-of ?) in the type HashMap<String,capture#2-of ?> is not applicable for the arguments (String, String)map.put("key", "va...

java – 类型参数在泛型对象实例化的构造函数中有用吗?【代码】

我知道自Java 7以来,在实例化过程中在构造函数中重复泛型类的类型是一种冗余.但是钻石操作符<>如何重复呢?换句话说,我想知道这有什么区别:List<String> Fruits = new ArrayList<>();还有这个List<String> Fruits = new ArrayList(); 或这个Map<Integer, String> students = new HashMap<>();还有这个Map<Integer, String> students = new HashMap();先感谢您解决方法:是,有一点不同.菱形运算符只是指定整个泛型类型的快捷方式,因...

java – 将对象数组转换为泛型数组【代码】

目前,我正在查看java.util.ArrayList的源代码.现在我发现函数public void ensureCapacity(int minCapacity)将一个对象数组转换为一个通用数组,就像下面的代码一样:E[] newData = (E[]) new Object[Math.max(current * 2, minCapacity)];但是,当我将数组声明为特定类型时,IDE将显示错误.Object[] arr = new Object[10];int[] arr1 = (int[]) new Object[arr.length];任何人都能告诉我他们之间的差异吗?非常感谢.解决方法:这是因为...

误解Java泛型【代码】

我的代码中遇到了一个令人困惑的问题. 我有一个签名方法public <T extends Measure> void sendNewMeasure(Class<T> type, T measure);在另一个类中,我有这个方法,它调用前一个:public <T extends Measure> void onNewMeasure(NewMeasureEvent<T> event) {T measure = event.getMeasure();APIInterface.getInstance().sendNewMeasure(measure.getClass(), measure); }我得到的错误是错误的参数类型,找到’T’,必需<?扩展com.blabl...