[Dart] 안전한 유효 코드를 작성하는 Generics(총칭형) 기반
[Dart] Generics(총칭)
개시하다
[참고] 공식 사이트
Generics(총칭)는
운영 환경
DartPad 및 Android Studio 등
Generics를 사용하지 않는 경우
class User {
final String callName;
User(this.callName);
}
void main() {
final user = User('Tanaka');
print(user.callName);
}
실행 결과Tanaka
class User {
final int callName;
User(this.callName);
}
void main() {
final user = User(1);
print(user.callName);
}
실행 결과1
dynamic callName
인 경우 문자열을 사용할 수 있습니다.final callName
로 기재되면callName은dynamic형class User {
final callName;
User(this.callName);
}
void main() {
final user = User('Tanaka');
print(user.callName);
}
실행 결과Tanaka
dynamic callName
면 숫자도 받을 수 있다class User {
final callName;
User(this.callName);
}
void main() {
final user = User(1);
print(user.callName);
}
실행 결과1
dynamic callName
에서 int가 값을 만든 후 String의 변수를 대입하려면 컴파일 오류가 발생하지 않고 실행 중 오류가 됩니다String name = user.callName.toString();
class User {
final callName;
User(this.callName);
}
void main() {
final user = User(1);
print(user.callName);
String name = user.callName;
}
실행 결과1
Uncaught Error: TypeError: 1: type 'JSInt' is not a subtype of type 'String'
Generics 사용 시
String name = user.callName;
에서 다음 오류가 발생했습니다.A value of type 'int' can't be assigned to a variable of type 'String'
class User<T> {
final T callName;
User(this.callName);
}
void main() {
final user = User(1);
print(user.callName);
String name = user.callName;
}
실행 결과Error compiling to JavaScript:
main.dart:9:22:
Error: A value of type 'int' can't be assigned to a variable of type 'String'.
String name = user.callName;
^
Error: Compilation failed.
T callName
인 경우 문자열class User<T> {
final T callName;
User(this.callName);
}
void main() {
final user = User('Tanaka');
print(user.callName);
}
실행 결과Tanaka
T callName
면 숫자도 받을 수 있다class User<T> {
final T callName;
User(this.callName);
}
void main() {
final user = User(1);
print(user.callName);
}
실행 결과1
<T>
는<TEST>
등T
class User<Test> {
final Test callName;
User(this.callName);
}
void main() {
final user = User('Tanaka');
print(user.callName);
}
실행 결과Tanaka
설정
User<String>('Tanaka')
또는 User<int>(1)
을 통해 Genericclass User<T> {
final T callName;
User(this.callName);
}
void main() {
final user = User<String>('Tanaka');
print(user.callName);
}
실행 결과Tanaka
Generics 계층 구조
class SingleUser<A> extends User<T> {}
시 다음 오류 발생The name 'T' isn't a type so it can't be used as a type argument
<T>
까지 해야 한다.extends User<T>
가 아니라extends User
면user1.callName
dynamic형으로 변한다= 다른 유형의 변수를 대입해도 컴파일 오류로 알려주지 않음
abstract class User<T> {
final T callName;
User(this.callName);
void call();
}
class SingleUser<T> extends User<T> {
SingleUser(T callName) : super(callName);
void call() {
print('call SingleUser');
print(callName);
}
}
class MultiUser<T, K> extends User<T> {
final K callNamePlus;
MultiUser(T callName, this.callNamePlus) : super(callName);
void call() {
print('call MultiUser');
print(callName);
print(callNamePlus);
}
}
void main() {
final user1 = SingleUser<String>('Tanaka');
user1.call();
final user2 = MultiUser<int, String>(1, 'Tanaka');
user2.call();
}
실행 결과call SingleUser
Tanaka
call MultiUser
1
Tanaka
User<T extends num>
지정 숫자(int or double)dart:core library - Dart API
T extends String
abstract class User<T extends num> {
final T callName;
User(this.callName);
void call();
}
class SingleUser<T extends num> extends User<T> {
SingleUser(T callName) : super(callName);
void call() {
print('call SingleUser');
print(callName);
}
}
class MultiUser<T extends num, K> extends User<T> {
final K callNamePlus;
MultiUser(T callName, this.callNamePlus) : super(callName);
void call() {
print('call MultiUser');
print(callName);
print(callNamePlus);
}
}
void main() {
final user1 = SingleUser<int>(1);
user1.call();
final user2 = MultiUser<int, String>(2, 'Tanaka');
user2.call();
}
실행 결과call SingleUser
1
call MultiUser
2
Tanaka
Generics 함수
T myself<T>(T name) => name;
void check<T>(T val) {}
abstract class User<T extends num> {
final T callName;
User(this.callName);
// Generics methods
T myself<T>(T name) => name;
void check<T>(T val) {
print('型名は以下');
print(T);
print(val);
}
}
class MultiUser<T extends num, K> extends User<T> {
final K callNamePlus;
MultiUser(T callName, this.callNamePlus) : super(callName);
}
void main() {
final user = MultiUser<int, String>(2, 'Tanaka');
final int userNameInt = user.myself<int>(user.callName);
final String userNameString = user.myself<String>(user.callNamePlus);
print(userNameInt);
print(userNameString);
user.check<int>(user.callName);
user.check<String>(user.callNamePlus);
}
실행 결과2
Tanaka
型名は以下
int
2
型名は以下
String
Tanaka
Reference
이 문제에 관하여([Dart] 안전한 유효 코드를 작성하는 Generics(총칭형) 기반), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/iwaku/articles/2020-12-21-iwaku텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)