Questions tagged «generics»

元技术,允许对运行时进行可靠类型的设置。


7
Java的泛型有什么问题?[关闭]
我在该站点上看到过多次文章,这些文章谴责Java对泛型的实现。现在,我可以诚实地说,使用它们没有任何问题。但是,我没有尝试自己做一个通用类。那么,Java的通用支持又有什么问题呢?
49 java  generics 

6
用有意义的类名屏蔽Java集合的好坏方法?
最近,我习惯于用人类友好的类名“掩盖” Java集合。一些简单的例子: // Facade class that makes code more readable and understandable. public class WidgetCache extends Map<String, Widget> { } 要么: // If you saw a ArrayList<ArrayList<?>> being passed around in the code, would you // run away screaming, or would you actually understand what it is and what // …

4
什么是仿制药滥用?
在查看一些代码时,我注意到有机会将其更改为使用泛型。(混淆的)代码如下所示: public void DoAllTheThings(Type typeOfTarget, object[] possibleTargets) { var someProperty = typeOfTarget.GetProperty(possibleTargets[0]); ... } 该代码可以用泛型代替,如下所示: public void DoAllTheThings<T>(object[] possibleTargets[0]) { var someProperty = type(T).getProperty(possibleTargets[0]); ... } 在研究这种方法的优点和缺点时,我发现了一个称为泛滥的术语。看到: 保护入门者(开发人员)不受泛型影响 https://stackoverflow.com/questions/28203199/is-this-an-abuse-of-generics https://codereview.stackexchange.com/q/60695 我的问题分为两个部分: 转向这样的泛型有什么好处?(性能?可读性?) 什么是泛型滥用?并通过一个通用的有一个类型参数的每一次滥用?
35 generics 

12
将通用对象存储在容器中然后从容器中获取对象并向下转换对象是否有代码味道?
例如,我有一个游戏,其中有一些工具可以提高玩家的能力: Tool.h class Tool{ public: std::string name; }; 和一些工具: 剑 class Sword : public Tool{ public: Sword(){ this->name="Sword"; } int attack; }; 盾 class Shield : public Tool{ public: Shield(){ this->name="Shield"; } int defense; }; 魔术衣 class MagicCloth : public Tool{ public: MagicCloth(){ this->name="MagicCloth"; } int attack; int defense; }; …

3
一个好的通用类型系统
人们普遍认为Java泛型在某些重要方面失败了。通配符和范围的组合导致了一些严重无法读取的代码。 但是,当我看其他语言时,似乎真的找不到程序员满意的通用类型系统。 如果我们将以下作为此类类型系统的设计目标: 总是产生易于阅读的类型声明 易于学习(无需复数协方差,逆方差等) 最大化编译时错误的数量 有没有正确的语言?如果我使用google,我唯一看到的就是对类型系统如何吸收X语言的抱怨。这种类型的复杂性是通用类型固有的吗?我们应该放弃在编译时尝试100%验证类型安全性的想法吗? 我的主要问题是,就这三个目标而言,哪种语言“做到最好”是最好的。我意识到这是主观的,但到目前为止,我什至找不到一种语言,并非所有程序员都同意通用类型系统是一团糟。 附录:如前所述,子类型/继承和泛型的结合才是造成复杂性的原因,所以我真的在寻找一种将两者结合起来并避免复杂性激增的语言。

8
C#泛型-如何避免冗余方法?
假设我有两个看起来像这样的类(第一段代码和一般问题与C#相关): class A { public int IntProperty { get; set; } } class B { public int IntProperty { get; set; } } 这些类不能以任何方式进行更改(它们是第三方聚会的一部分)。因此,我不能使它们实现相同的接口,也不能继承将包含IntProperty的相同类。 我想对IntProperty两个类的属性都应用一些逻辑,在C ++中,我可以使用模板类很容易地做到这一点: template <class T> class LogicToBeApplied { public: void T CreateElement(); }; template <class T> T LogicToBeApplied<T>::CreateElement() { T retVal; retVal.IntProperty = 50; return retVal; …
28 c#  generics 

1
<和有什么区别?扩展了Foo>和<Foo>
我似乎对&lt;Foo&gt;和之间的区别有误解&lt;? extends Foo&gt;。据我了解,如果我们有 ArrayList&lt;Foo&gt; foos = new ArrayList&lt;&gt;(); 这表明Foo可以将类型的对象添加到此数组列表中。由于的子类Foo也是type Foo,因此也可以添加它们而不会出现错误,如下所示 ArrayList&lt;Foo&gt; foos = new ArrayList&lt;&gt;(); foos.add(new Foo()); foos.add(new Bar()); 在哪里Bar extends Foo。 现在,说我定义foos为 ArrayList&lt;? extends Foo&gt; foos = new ArrayList&lt;&gt;(); 我目前的理解是,这表示some unknown type that extends Foo。我的意思是可以将任何属于其子类的对象Foo添加到此列表中。表示ArrayList&lt;Foo&gt;和之间没有区别ArrayList&lt;? extends Foo&gt;。 为了对此进行测试,我尝试编写以下代码 ArrayList&lt;? extends Foo&gt; subFoos = new ArrayList&lt;&gt;(); subFoos.add(new Foo()); subFoos.add(new Bar()); …
20 java  generics 

3
泛型与通用接口?
我不记得上次写泛型类的时间。每次经过思考后我都认为不需要时,我认为不需要它。 这个问题的第二个答案让我要求澄清(因为我还不能发表评论,所以我提出了一个新问题)。 因此,让我们以给定的代码为例,说明需要泛型的情况: public class Repository&lt;T&gt; where T : class, IBusinessOBject { T Get(int id) void Save(T obj); void Delete(T obj); } 它具有类型约束: IBusinessObject 我通常的想法是:该类只能使用IBusinessObject,使用该类的也是如此Repository。存储库存储这些对象IBusinessObject,最有可能的客户端Repository将希望通过IBusinessObject接口获取和使用对象。那为什么不只是为了 public class Repository { IBusinessOBject Get(int id) void Save(IBusinessOBject obj); void Delete(IBusinessOBject obj); } 那个例子不好,因为它只是另一种类型的集合,而通用集合是经典的。在这种情况下,类型约束看起来也很奇怪。 实际上,该示例class Repository&lt;T&gt; where T : class, IBusinessbBject与class BusinessObjectRepository我非常相似。泛型是要修复的东西。 重点是:泛型除了集合之外,是否对其他任何东西都有用,并且类型约束不会使泛型成为专用对象,就像使用类约束而不是在类内部使用泛型类型参数一样?

4
谁扩展接口?又为什么呢
AFAIK,我的班级extends父类和implements接口。但是我遇到了无法使用的情况implements SomeInterface。它是泛型类型的声明。例如: public interface CallsForGrow {...} public class GrowingArrayList &lt;T implements CallsForGrow&gt; // BAD, won't work! extends ArrayList&lt;T&gt; 在implements语法上禁止使用。我首先想到的是,完全禁止在&lt;&gt;中使用接口,但是没有。有可能,我只需要使用 extends而不是implements。结果,我正在“扩展”接口。这个另一个例子有效: public interface CallsForGrow {...} public class GrowingArrayList &lt;T extends CallsForGrow&gt; // this works! extends ArrayList&lt;T&gt; 在我看来,这似乎是句法上的不一致。但是也许我不理解Java 6的一些技巧?我应该在其他地方扩展接口吗?我要扩展的接口是否应该具有某些特殊功能?

8
如何在团队成员之间传播对通用编程的认识?
我住在一个人们相信的环境中: Java泛型是专门用于库编写而不是实际编码的功能。 C ++是一种OO编程语言;template是可选的和可避免的功能 但是,这些人高度依赖使用通用编程编写的库(例如STL,Java容器)。如果我使用templates或编写代码generics,则代码审阅者很可能会拒绝它,并会以“正确/可理解/优雅”的方式发表评论以编写代码。 这种心态适用于普通程序员到高级经理。没有出路,因为90%的时间里,这些人都有自己的游说手段。 解释它们的最佳方法是什么(不被割断),同时编写构成OO和通用编程的代码的实用方法是什么?
20 java  c++  templates  generics 

2
为什么在C#中有一个new()约束,但没有其他类似的约束?
在C#泛型中,我们可以说,使类型参数T具有默认构造函数的约束where T : new()。但是,没有其他像这样的约束有效(new(string)例如,等等)。 从语言设计和/或实现的角度来看,这是什么原因? 构造函数的工作方式或类型系统的实现方式是否有某些禁止(或至少使之更加困难)的东西?如果是这样,那是什么?我记得读书的地方,default(T)实际上编译到new T()了T : struct。可能与此有关吗? 还是仅仅是为了避免使语言过于复杂而做出的设计决定?

4
Java-使用多态或有界类型参数
假设我有这个类层次结构... public abstract class Animal { public abstract void eat(); public abstract void talk(); } class Dog extends Animal { @Override public void eat() { } @Override public void talk() { } } class Cat extends Animal { @Override public void eat() { } @Override public void talk() { } …

2
高阶参数多态性有用吗?
我很确定每个人都熟悉以下形式的通用方法: T DoSomething&lt;T&gt;(T item) 此功能也称为参数多态(PP),特别是等级1 PP。 假设可以使用以下形式的函数对象来表示此方法: &lt;T&gt; : T -&gt; T 即,&lt;T&gt;意味着需要一种类型的参数,以及T -&gt; T装置,它需要类型的一个参数T并返回相同的类型的值。 那么以下将是2级PP函数: (&lt;T&gt; : T -&gt; T) -&gt; int 该函数本身不接受任何类型参数,但接受一个具有类型参数的函数。您可以迭代地继续进行此操作,使嵌套越来越深,PP等级越高。 在编程语言中,此功能确实很少见。默认情况下,甚至Haskell也不允许。 它有用吗?它可以描述很难用其他方式描述的行为吗? 此外,强制性意味着什么?(在这种情况下)

3
泛型如何实现?
从编译器内部角度来看,这是一个问题。 我对泛型感兴趣,而不是模板(C ++),所以我用C#标记了问题。不是Java,因为AFAIK两种语言的泛型在实现上有所不同。 当我查看不带泛型的语言时,它非常简单,您可以验证类定义,将其添加到层次结构中就可以了。 但是如何处理泛型类,更重要的是如何处理对它的引用?如何确保每个实例的静态字段都是奇异的(即每次解析通用参数时)。 假设我看到一个电话: var x = new Foo&lt;Bar&gt;(); 是否将新Foo_Bar类添加到层次结构? 更新:到目前为止,我仅找到2条相关的帖子,但是即使它们在“如何自己做”的意义上也没有涉及太多细节: http://www.jprl.com/Blog/archive/development/2007/Aug-31.html http://www.artima.com/intv/generics2.html
16 c#  generics 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.