,那么如何在Swift?中定义泛型类常量
问题所在
对于“普通”类,您可以这样定义它们:
class C {
static let k = 1
}
let a = C.k // 1
但是,如果在泛型类上也这样做:
class C<T> {
static let k = 1
}
编译时会出现以下错误:
泛型类型中不支持的静态存储属性
,那么如何解决这个问题?
我目前的解决方案
现在,我正在使用struct来解决这个问题:
struct CConstant {
static let K = 1
}
这在泛型类的作用域中没有定义,但它对我有效。你有更
这是从编译器内部角度提出的问题。
我对泛型感兴趣,而不是模板(C++),所以我用C#标记了这个问题。而不是Java,因为AFAIK两种语言中的泛型在实现上有所不同。
当我查看语言w/o泛型时,它非常简单,您可以验证类定义,将其添加到层次结构中,仅此而已。
但是如何处理泛型类,更重要的是如何处理对它的引用呢?如何确保每个实例化的静态字段都是单数(即每次解决泛型参数时)。
假设我看到一个电话:
var x = new Foo<Bar>();
我是否向层次结构中添加了新的Foo_Bar类?
更新:到目前为止,我只发现了两篇相关的文章,然而,即使它们在“如何自己做”的意义上也没有太多的细节
按照C#规范在10.4 Constants中使用
常量声明中指定的类型必须是s字节、字节、短、ushort、int、uint、long、ulong、char、float、double、十进制、bool、string、枚举类型、或引用类型。每个常量表达式必须产生目标类型的值或可以通过隐式转换转换为目标类型的类型的值(§6.1)。
为什么我不能做下面的事:
public class GenericClass<T>
where T : class
{
public const T val = null;
}
这应该是可能的,因为:
where T : clas
根据堆栈溢出时的答案,C#中的泛型类型在运行时中被解析。
但是,根据答案,在C#中,泛型类型是在编译时解析的。
我在这里错过了什么?
换句话说,T类型是在编译时解析还是在运行时解析?
更新:
基于Oded的回答,在这样的情况下,类型是封闭的具体类型(这意味着它将在编译时被解析)
class Program
{
static void Main()
{
var t = new Test<int>();
}
}
public class Test<T>
{
}
MSIL是否会有相当于
class Program
{
这可以从我们的数据库中的Address对象中分割出一个DDL对象:
public class DDL {
public int? id { get; set; }
public string name { get; set; }
}
List<DDL> mylist = Addresses
.Select( q => new DDL { id = q.id, name = q.name })
.ToList();
但是,我们希望将POCO到ViewModel的映射保持在MVC控制器代码之外的一个地方。我们想做这样的事情:
List&l
假设我有一个泛型类Foo<T>。
我想要做的是为各种T中的每一个创建一个singleton,然后在以后通过T快速检索它们。
在伪代码中
STORE new Foo<int>
STORE new Foo<MyClass>
GET instance for MyClass -> returns the Foo<MyClass> created above.
在Java语言中,我会创建一个键为Type,值为Foo<*>的字典。
在C#中等效的魔术是什么?
我正在将一些C#代码移植到Java。我在where语法方面有问题,特别是新()。我知道where类似于Java的泛型:t扩展FOO。
如何在Java?中复制新的()参数
ie:
public class BAR<T> : BAR
where T : FOO, new()
下面是我如何实现cletus的解决方案:
public class BAR<T extends FOO> extends ABSTRACTBAR {
public BAR(T t) throws InstantiationException, IllegalAccessExcep
框架: Spring,Hibernate。O/S:窗口
我试图按照这个的方向实现hibernate的自定义消息内插器。
在实现下面的类时,它提供了一个错误“不能对非静态类型区域设置进行静态引用”。
public class ClientLocaleThreadLocal<Locale> {
private static ThreadLocal tLocal = new ThreadLocal();
public static void set(Locale locale) {
tLocal.set(locale);
}
public static Loc
我想创建以下类片段
class Lookup<TKey,TValue,TCollection>
where TCollection : ICollection<>
{
public TCollection<TKey> _KeyCollection;
public TCollection<TValue> _ValueCollection;
}
这种模式在C#中一般是可能的吗?在当前的表单中,编译器不喜欢它。您似乎不能将类型参数约束为泛型。然而,这似乎是一个合理的事情想要做。有什么办法可以达到吗?
注意事项:这个问题专门涉及泛型和类型
问题1:我对这些代码有点困惑:
public class MyClass1 <E extends Enum<?>> {
// ...
}
public class MyClass2 <E extends Enum<E>> {
// ...
}
MyClass1和MyClass2的区别是什么,这三种不同的E意味着什么?
问题2:来自
这是所有Java语言枚举类型的公共基类。
但是不是所有Enum类型的Enum<E>的公共基类吗?
问题3:现在我有一节课:
public class MyClass<E ex
public static class MyClass
{
public static void Print<T>(this T theObject)
{
Console.WriteLine("The print output is " + theObject.ToString());
}
}
在给定的类中,我指定了一个泛型作为要通过this关键字扩展的类型。由于我已经将类型的定义推迟到编译时,intellisense (以及其他相关内容)如何知道我正在扩展的是什么类型?C#是否只是默认使用顶层System.Object
在Java中,是否可以在接口中使用类型变量作为数组元素?
我尝试过作为一个字段类型和一个强制转换操作符,但是始终会得到错误
无法对非静态类型A进行静态引用
interface ITest<A> {
A[] j; // Cannot make a static reference to the non-static type A
Object[] = (A[]) new Object[3]; // Cannot make a static reference to the non-static type A
}
在任何情况下,我能够在接口中使用构造A[] (以
我知道许多编程和脚本语言,但我以前从未见过这样的东西:
camera = GetComponentInParent<Camera>();
这在C#是正常的吗?为什么我们不用这样传递参数Camera:
camera = GetComponentInParent(Camera);
我在哪里可以告诉自己为什么会这样?
试图创建具有泛型类型的静态字段并不编译:
class MyClass {
public static Function<Z, Z> blargh = new Function<Z, Z>() {
public Z apply(Z a) {
return a;
}
};
}
Eclipse说:
Multiple markers at this line
- Z cannot be resolved to a type
- Z cannot be resolved to a type
我想编写与C#代码相当的Java代码。
我的C#代码如下:
public abstract class A<T> where T : A<T>, new()
{
public static void Process()
{
Process(new T());
}
public static void Process(T t)
{
// Do Something...
}
}
public class B : A<B>
{
}
public class C : A<C&
我试图使用泛型类来实现一个通用的“可变”方法,我不知道C#是否能做到这一点。我将解释一下情况:我有一个类,它代表数据库中的一个实体,其属性被标记为属性PrimaryKey和字段。示例:
public class Car :TableEntity
{
[Field]
[PrimaryKey]
public string RegNumber{get;set;}
[Field]
public string Color{get;set;}
}
我试图实现的是使用TableEntity类实例
class T
{
enum E { }
struct S { }
interface I { }
delegate void D();
class C { }
const E e = new E();
//const S s = default(S); // ERROR
const I i = default(I);
const D d = default(D);
const C c = default(C);
const int x = 10;
const string y = "s
我是java.I刚刚读过关于java泛型的教程。
有一个关于声明泛型方法和构造函数的部分。
Methods and constructors can be generic if they declare one/more type variables.
public static <T>T getFirst (List<T> list)
此方法接受对List的引用,并将返回类型为T的对象。
为什么静态后有T?这是印刷错误吗?
那是什么意思?
我是java的初学者,是泛型概念的新手。
在我们的代码库中,我看到了下面的代码片段,我不知道它是什么(这就是为什么,我无法开始搜索更多的信息)。代码片段如下;
TypedId.< UserGroupsVO > valueOf( 1000L )
为了得到更多的澄清,TypedId类的定义如下;
public final class TypedId< T > implements Serializable, Comparable< TypedId< T >>
在哪个主题下可以更多地了解这个语法以及它的含义?
编辑
在发表意见后,我需要澄清我的问题。在我的问题中,不是指泛型。我不明白的部分是T
为什么不是原始类型,泛型类中的静态变量?
例如,
public class MyType<E> {
class Inner { }
static class Nested { }
public static void main(String[] args) {
MyType mt; // warning: MyType is a raw type
MyType.Inner inn; // warning: MyType.Inner is a raw type
MyType.Nest
using System;
namespace ConsoleApplication15
{
using System.Collections.Generic;
using System.Threading;
public static class Program
{
static void Main(string[] args)
{
var test1 = new Test<List<int>>();
var t = new Thread(Tester);
t.Start();
va
我本来希望做这样的事情,但在C#中这似乎是非法的:
public Collection MethodThatFetchesSomething<T>()
where T : SomeBaseClass
{
return T.StaticMethodOnSomeBaseClassThatReturnsCollection();
}
我得到一个编译时错误:
类型“T”是“参数”,它在给定的上下文中无效。
给定一个泛型类型参数,我如何在泛型类上调用静态方法?给定约束,静态方法必须可用。