Tag: generics

generics和原始类型

我使用generics编写了一些代码,我遇到了以下我无法理解的情况: 我有接口IpRange,以及以下类: public class Scope<IpRange> { List<IpRange> rangesList; public List<IpRange> getRangesList() {return rangesList;} } 现在来自一些测试类,如果我写下面的内容: Scope myScope = new Scope(); scope.getRangesList().get(0) 我得到IpRange类型的对象,但如果我使用原始类型并执行此操作: Scope myScope = new Scope(); scope.getRangesList().get(0) 我得到了Object,我不能使用ipRange方法,除非我明确地将它转换为Range。 如果它本来是List我得到它,因为我使用原始类型编译器无法知道列表项的实际类型是什么,但在这种情况下它将始终是IpRange类型,所以为什么我’我没有得到对象? 问题在于,当我创建示波器时,我不一定知道实际的范围类型。 考虑这个构造函数:public Sc​​ope(String rangeStringList); 据我所知,字符串可以是“16.59.60.80”或“fe80 :: 10d9:159:f:fffa%”。 但我所知道的是,我将一些IpRange对象传递给编译器,我希望能够使用此接口,无论是ipv4还是ipv6。 而且由于即使我使用了行类型,编译器也可以确定这是ipRange,我想知道为什么java选择这样做

Java:组合generics,内部类和“实现”的问题

我遇到了generics, implements和内部类的问题。 我正在创建一个包含内部类的LinkedBinaryHeap类。 这个内部类是通用的HeapNode ,它扩展了我创建的通用Node类; 它只是为键/优先级添加变量和方法。 在LinkedBinaryHeap我创建了一个通用的LinkedList来存储HeapNode 。 我假设存储的通用数据扩展了Comparable类。 这是什么存储什么的布局: BinaryHeap->LinkedList(Nodes)->HeapNode(extends Node)->DATA,KEY 我的问题是在声明LinkedList : LinkedList heap; eclipse强调HeapNode并给我错误: 绑定不匹配:LinkedBinaryHeap.HeapNode类型不是 有效替代有界参数> LinkedList类型 我认为错误告诉我HeapNode必须实现Comparable ,但是我的Node类实现了Comparable ,所以这是照顾的,对吗? 我尝试了各种不同的东西,但似乎没有任何效果,下面的代码是我最接近的。 请注意,我已经尝试将implements Comparable Node从HeapNode内部类中HeapNode ,并且它什么都没有改变。 码: LinkedBinaryHeap.java: public class LinkedBinaryHeap<E extends Comparable> { private LinkedList heap; public LinkedBinaryHeap(){ heap = new LinkedList(); } /* INNER CLASS DECLARATION. */ private class HeapNode extends […]

Spring 4generics类,获取参数化类型

您在Spring中有一个Generic类,我想为注入的bean获取通用的T类类。 我知道Java中的经典方法,并了解Spring 4如何实现Java Generics 。 此外,我试图找到一个使用ResolvableType的解决方案但没有任何作用。 @Autowired GenericDao specificdao; public GenericDaoImpl { private Class type; public DaoImpl () { this.type = …? } public T findById(Serializable id) { return (T) HibernateUtil.findById(type, id); } } 有什么方法可以避免这种情况吗? @Autowired @Qualifier GenericDao specificdao; @Repository(“specificdao”) public SpecificDaoImpl extends GenericDao { public SpecificDaoImpl () { // assuming the constructor is implemented […]

更广泛的递归/generics问题

基于这里提出和回答的问题,我有一个更复杂的问题(至少在我看来)。 为了使阅读(和回答)更容易,我将在此重述完整的代码示例: 让我们从定义一组类/接口开始: public interface Node<NT extends Node, ET extends Edge> { /* internal datastructures here */ } public interface Edge<NT extends Node, ET extends Edge> { /* internal datastructures here */ } public interface Graph<NT extends Node, ET extends Edge> { /* internal datastructures here */ } public class JunctionNode implements Node { } […]

传递给方法的无界通配符

public class ColTest { static T wildSub(ArrayList holder, T arg){ T t=holder.get(0); return t; } public static void main(String[] args) { ArrayList list=new ArrayList(Arrays.asList(2L,3L,7L)); Long lng=1L; ColTest.wildSub(list, lng); } } 真的很感兴趣为什么这个片段是合法的,因为wildSub的签名只接受T ArrayList或从T派生,以及类型为T arg。 但表示 – 某些特定类型,未知,以及它如何满足编译器? 毕竟类型并不意味着 …

Proguard破坏了我的清洁。 Gson和仿制药

我有一个从持久性加载信息的函数,我只是以一种非常简单的方式告诉它的类型。 该类称为SharedPreferencesHelper.kt因此它是一个真正的生活问题解决者: fun loadList(context: Context, fileName: String, key: String, defValue: ArrayList) : ArrayList { val gson = MyGsonDependency.getInstance() val json = getWithFileName(context, fileName).getString(key, gson.toJson(defValue)) return gson.fromJson(json, object : TypeToken<ArrayList>() {}.type) } 加载,例如,我只是做一个ArrayList : SharedPreferencesHelper.loadList( context, FILE_NAME, KEY, ArrayList()) 我发现的问题是当我运行Proguard并模糊我的代码时,每当我调用object : TypeToken<ArrayList>() {}.type我得到一个exception: Caused by: java.lang.AssertionError: illegal type variable reference at libcore.reflect.TypeVariableImpl.resolve(TypeVariableImpl.java:111) at libcore.reflect.TypeVariableImpl.getGenericDeclaration(TypeVariableImpl.java:125) at libcore.reflect.TypeVariableImpl.hashCode(TypeVariableImpl.java:47) […]

使用与SomeAbstract

我正在从DotNet转向java,这种扩展的想法是新的。 我看过一些post,完全解释使用List List vs. List List vs. List ,但我猜测在generics中使用和不使用扩展之间没有区别。 真的吗? 如果使用抽象类作为父级,答案会改变吗? class My_AbstractExtends 与 class My_Abstract 编辑 按如下方式创建子类 class My_ChildExtends extends My_AbstractExtends 与 class My_Child extends My_Abstract

C#到Java:其中T:new()语法

我正在将一些C#代码移植到Java上。 我遇到了Syntax的问题​​,特别是new()。 我理解在哪里类似于Java的generics:T扩展了FOO。 我如何在Java中复制new()参数? “new()Constraint让编译器知道提供的任何类型参数必须具有可访问的无参数 – 或默认构造函数。” – MSDN 即: public class BAR : BAR where T : FOO, new() 以下是我实施cletus解决方案的方法: public class BAR extends ABSTRACTBAR { public BAR(T t) throws InstantiationException, IllegalAccessException{ t.getClass().newInstance(); this.value = t; } }

具有generics参数基础的Javagenerics参数

我想知道在Java中是否有一个优雅的解决方案(除了显而易见的一个 – 声明一个不同的/显式函数。这是代码: private static HashMap nameStringIndexMap = new HashMap(); private static HashMap nameBufferIndexMap = new HashMap(); // and a function private static String newName(Object object, HashMap nameIndexMap){ …. } 问题是我无法将nameStringIndexMap或nameBufferIndexMap参数传递给函数。 除了做另一个明确需要HashMap 或HashMap 参数的函数之外,我不知道更优雅的解决方案。 我的问题是:这可以用更优雅的解决方案/使用generics或类似的东西来制作吗? 谢谢, 尤利安

是否可以编写一个接受不同抽象的generics参数的方法?

作为这个问题的后续 ,是否有可能编写一个方法,将Dog添加到合适的房间? (在这个例子中,它可以接受Animal室或Dog室。)或者我是否被迫写下两种不同的方法如下? (因为类型擦除,我甚至不能依赖重载)。 public class Rooms { interface Animal {} class Dog implements Animal {} class Room { void add(T t) {} } void addDogToAnimalRoom(Room room) { room.add(new Dog()); } void addDogToDogRoom(Room room) { room.add(new Dog()); } }