C#에 "익명"일반 태그가 있습니까? 자바에서?
문제
Java에서는 다음과 같이 "알 수 없는" 일반 유형으로 매개변수화된 변수를 선언할 수 있습니다.
Foo<?> x;
C#에 이 물음표에 해당하는 구문이 있나요?
해결책
짧은 대답은 '아니요'입니다.C#에는 이에 상응하는 기능이 없습니다.
해결 방법은 다음과 같습니다. Java 개발자의 관점에서 본 C# 작성자: Dare Obasanjo
어떤 경우에는 특정 유형을 포함하는 데이터 구조가 아닌 모든 유형을 포함하는 데이터 구조에서 작동할 수 있는 메서드를 만들어야 할 수도 있습니다(예:데이터 구조의 모든 객체를 인쇄하는 방법) 제네릭의 강력한 유형 지정의 이점을 계속 활용합니다.C#에서는 이를 지정하는 메커니즘이 일반 유형 추론이라는 기능을 통해 이루어지지만 Java에서는 와일드카드 유형을 사용하여 수행됩니다.다음 코드 샘플은 두 접근 방식이 어떻게 동일한 결과를 가져오는지 보여줍니다.
C# 코드
using System;
using System.Collections;
using System.Collections.Generic;
class Test{
//Prints the contents of any generic Stack by
//using generic type inference
public static void PrintStackContents<T>(Stack<T> s){
while(s.Count != 0){
Console.WriteLine(s.Pop());
}
}
public static void Main(String[] args){
Stack<int> s2 = new Stack<int>();
s2.Push(4);
s2.Push(5);
s2.Push(6);
PrintStackContents(s2);
Stack<string> s1 = new Stack<string>();
s1.Push("One");
s1.Push("Two");
s1.Push("Three");
PrintStackContents(s1);
}
}
자바 코드
import java.util.*;
class Test{
//Prints the contents of any generic Stack by
//specifying wildcard type
public static void PrintStackContents(Stack<?> s){
while(!s.empty()){
System.out.println(s.pop());
}
}
public static void main(String[] args){
Stack <Integer> s2 = new Stack <Integer>();
s2.push(4);
s2.push(5);
s2.push(6);
PrintStackContents(s2);
Stack<String> s1 = new Stack<String>();
s1.push("One");
s1.push("Two");
s1.push("Three");
PrintStackContents(s1);
}
}
다른 팁
AFAIK C#에서는 그렇게 할 수 없습니다.BCL이 수행하는 작업과 많은 예제는 일반 클래스가 아닌 클래스를 만든 다음 이전 클래스의 기본 동작을 상속하는 일반 클래스를 만드는 것입니다.아래 예를 참조하세요.
class Foo
{
}
class Foo<T> : Foo
{
}
다음과 같이 작성할 수 있습니다.
Foo t = new Foo<int>();
분명히 깨끗한 접근 방식은 아니지만 Foo<object> x
적합할 수도 있습니다.
C#에는 동등한 구문이 없습니다.
C#에 이에 상응하는 기능이 없다는 것은 사실이 아닙니다.유형으로 사용하거나 메소드를 호출할 수 있는 정적 등가물은 없습니다.이를 위해 다음을 사용하십시오. 호르헤의 대답.
반면에 때로는 성찰을 위해 동등한 아이디어가 필요하며 거기에 동등한 것이 있습니다.당신이 가지고 있다면:
interface IFoo<T>
{
T Bar(T t, int n);
}
당신은 얻을 수 있습니다 Type
이는 IFoo<int>
사용하여 typeof(IFoo<int>)
.덜 잘 알려져 있고 귀하의 질문에 대한 부분적인 대답은 다음과 같습니다. Type
이는 IFoo<T>
사용하여 typeof(IFoo<>)
.
사용하고 싶을 때 유용합니다. IFoo<T>
일부 T
반사를 통해 알 수 없습니다 T
런타임까지.
Type theInterface = typeof(IFoo<>);
Type theSpecificInterface = theInterface.MakeGenericType(typeof(string));
// theSpecificInterface now holds IFoo<string> even though we may not have known we wanted to use string until runtime
// proceed with reflection as normal, make late bound calls / constructions, emit DynamicMethod code, etc.
아니요, C#에는 실제로 동일한 개념이 없습니다.Foo의 기본 클래스(제네릭이 아닌 Foo일 수 있음)를 참조하거나 작업 중인 메서드를 제네릭 자체로 만들어야 합니다(Foo를 참조할 수 있고 메서드 호출자가 T가 무엇인지 결정하도록 해야 함). 이다).
도움이 되길 바랍니다.